Python matplotlib.dates() Examples
The following are 30 code examples for showing how to use matplotlib.dates(). These examples are extracted from open source projects. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example.
You may check out the related API usage on the sidebar.
You may also want to check out all available functions/classes of the module
matplotlib
, or try the search function
.
Example 1
Project: hydrology Author: Kirubaharan File: check_dam_talk_plot.py License: GNU General Public License v3.0 | 6 votes |
def find_previous_inflow_date(df, inflow_dates): """ Calculates no of days from inflow event for dates in df :param df: Input df :param inflow_dates:datetime index of inflow pandas dataframe :return: """ # insert_dummy_columns df['days_from_inflow'] = 0 for date in df.index: deltas = inflow_dates - date days_from_inflow = np.max([n for n in deltas.days if n < 0]) df.loc[date, 'days_from_inflow'] = np.abs(days_from_inflow) return df # print len(inflow_days_591_df.index)
Example 2
Project: ecg-htm Author: iizukak File: nupic_anomaly_output.py License: GNU Affero General Public License v3.0 | 6 votes |
def extractWeekendHighlights(dates): weekendsOut = [] weekendSearch = [5, 6] weekendStart = None for i, date in enumerate(dates): if date.weekday() in weekendSearch: if weekendStart is None: # Mark start of weekend weekendStart = i else: if weekendStart is not None: # Mark end of weekend weekendsOut.append(( weekendStart, i, WEEKEND_HIGHLIGHT_COLOR, HIGHLIGHT_ALPHA )) weekendStart = None # Cap it off if we're still in the middle of a weekend if weekendStart is not None: weekendsOut.append(( weekendStart, len(dates)-1, WEEKEND_HIGHLIGHT_COLOR, HIGHLIGHT_ALPHA )) return weekendsOut
Example 3
Project: neural-network-animation Author: miloharper File: dates.py License: MIT License | 6 votes |
def datestr2num(d, default=None): """ Convert a date string to a datenum using :func:`dateutil.parser.parse`. Parameters ---------- d : string or sequence of strings The dates to convert. default : datetime instance The default date to use when fields are missing in `d`. """ if cbook.is_string_like(d): dt = dateutil.parser.parse(d, default=default) return date2num(dt) else: if default is not None: d = [dateutil.parser.parse(s, default=default) for s in d] d = np.asarray(d) if not d.size: return d return date2num(_dateutil_parser_parse_np_vectorized(d))
Example 4
Project: GraphicDesignPatternByPython Author: Relph1119 File: dates.py License: MIT License | 6 votes |
def datestr2num(d, default=None): """ Convert a date string to a datenum using :func:`dateutil.parser.parse`. Parameters ---------- d : string or sequence of strings The dates to convert. default : datetime instance, optional The default date to use when fields are missing in *d*. """ if isinstance(d, str): dt = dateutil.parser.parse(d, default=default) return date2num(dt) else: if default is not None: d = [dateutil.parser.parse(s, default=default) for s in d] d = np.asarray(d) if not d.size: return d return date2num(_dateutil_parser_parse_np_vectorized(d))
Example 5
Project: GraphicDesignPatternByPython Author: Relph1119 File: dates.py License: MIT License | 6 votes |
def tick_values(self, vmin, vmax): delta = relativedelta(vmax, vmin) # We need to cap at the endpoints of valid datetime try: start = vmin - delta except (ValueError, OverflowError): start = _from_ordinalf(1.0) try: stop = vmax + delta except (ValueError, OverflowError): # The magic number! stop = _from_ordinalf(3652059.9999999) self.rule.set(dtstart=start, until=stop) dates = self.rule.between(vmin, vmax, True) if len(dates) == 0: return date2num([vmin, vmax]) return self.raise_if_exceeds(date2num(dates))
Example 6
Project: GraphicDesignPatternByPython Author: Relph1119 File: dates.py License: MIT License | 6 votes |
def __init__(self, byweekday=1, interval=1, tz=None): """ Mark every weekday in *byweekday*; *byweekday* can be a number or sequence. Elements of *byweekday* must be one of MO, TU, WE, TH, FR, SA, SU, the constants from :mod:`dateutil.rrule`, which have been imported into the :mod:`matplotlib.dates` namespace. *interval* specifies the number of weeks to skip. For example, ``interval=2`` plots every second week. """ if isinstance(byweekday, np.ndarray): # This fixes a bug in dateutil <= 2.3 which prevents the use of # numpy arrays in (among other things) the bymonthday, byweekday # and bymonth parameters. [x.item() for x in byweekday.astype(int)] rule = rrulewrapper(DAILY, byweekday=byweekday, interval=interval, **self.hms0d) RRuleLocator.__init__(self, rule, tz)
Example 7
Project: python3_ios Author: holzschu File: dates.py License: BSD 3-Clause "New" or "Revised" License | 6 votes |
def datestr2num(d, default=None): """ Convert a date string to a datenum using :func:`dateutil.parser.parse`. Parameters ---------- d : string or sequence of strings The dates to convert. default : datetime instance, optional The default date to use when fields are missing in *d*. """ if isinstance(d, str): dt = dateutil.parser.parse(d, default=default) return date2num(dt) else: if default is not None: d = [dateutil.parser.parse(s, default=default) for s in d] d = np.asarray(d) if not d.size: return d return date2num(_dateutil_parser_parse_np_vectorized(d))
Example 8
Project: python3_ios Author: holzschu File: dates.py License: BSD 3-Clause "New" or "Revised" License | 6 votes |
def tick_values(self, vmin, vmax): delta = relativedelta(vmax, vmin) # We need to cap at the endpoints of valid datetime try: start = vmin - delta except (ValueError, OverflowError): start = _from_ordinalf(1.0) try: stop = vmax + delta except (ValueError, OverflowError): # The magic number! stop = _from_ordinalf(3652059.9999999) self.rule.set(dtstart=start, until=stop) dates = self.rule.between(vmin, vmax, True) if len(dates) == 0: return date2num([vmin, vmax]) return self.raise_if_exceeds(date2num(dates))
Example 9
Project: python3_ios Author: holzschu File: dates.py License: BSD 3-Clause "New" or "Revised" License | 6 votes |
def __init__(self, byweekday=1, interval=1, tz=None): """ Mark every weekday in *byweekday*; *byweekday* can be a number or sequence. Elements of *byweekday* must be one of MO, TU, WE, TH, FR, SA, SU, the constants from :mod:`dateutil.rrule`, which have been imported into the :mod:`matplotlib.dates` namespace. *interval* specifies the number of weeks to skip. For example, ``interval=2`` plots every second week. """ if isinstance(byweekday, np.ndarray): # This fixes a bug in dateutil <= 2.3 which prevents the use of # numpy arrays in (among other things) the bymonthday, byweekday # and bymonth parameters. [x.item() for x in byweekday.astype(int)] rule = rrulewrapper(DAILY, byweekday=byweekday, interval=interval, **self.hms0d) RRuleLocator.__init__(self, rule, tz)
Example 10
Project: nupic.critic Author: htm-community File: nupic_output.py License: GNU Affero General Public License v3.0 | 6 votes |
def __init__(self, *args, **kwargs): super(NuPICPlotOutput, self).__init__(*args, **kwargs) self.names = [self.name] # Turn matplotlib interactive mode on. plt.ion() self.dates = [] self.convertedDates = [] self.actualValues = [] self.predictedValues = [] self.actualLines = [] self.predictedLines = [] self.linesInitialized = False self.graphs = [] plotCount = len(self.names) plotHeight = max(plotCount * 3, 6) fig = plt.figure(figsize=(14, plotHeight)) gs = gridspec.GridSpec(plotCount, 1) for index in range(len(self.names)): self.graphs.append(fig.add_subplot(gs[index, 0])) plt.title(self.names[index]) plt.ylabel('Frequency Bucket') plt.xlabel('Seconds') plt.tight_layout()
Example 11
Project: nupic.critic Author: htm-community File: nupic_output.py License: GNU Affero General Public License v3.0 | 6 votes |
def initializeLines(self, timestamps): for index in range(len(self.names)): print "initializing %s" % self.names[index] # graph = self.graphs[index] self.dates.append(deque([timestamps[index]] * WINDOW, maxlen=WINDOW)) # print self.dates[index] # self.convertedDates.append(deque( # [date2num(date) for date in self.dates[index]], maxlen=WINDOW # )) self.actualValues.append(deque([0.0] * WINDOW, maxlen=WINDOW)) self.predictedValues.append(deque([0.0] * WINDOW, maxlen=WINDOW)) actualPlot, = self.graphs[index].plot( self.dates[index], self.actualValues[index] ) self.actualLines.append(actualPlot) predictedPlot, = self.graphs[index].plot( self.dates[index], self.predictedValues[index] ) self.predictedLines.append(predictedPlot) self.linesInitialized = True
Example 12
Project: nupic.critic Author: htm-community File: nupic_output.py License: GNU Affero General Public License v3.0 | 6 votes |
def __init__(self, *args, **kwargs): super(NuPICPlotOutput, self).__init__(*args, **kwargs) self.names = [self.name] # Turn matplotlib interactive mode on. plt.ion() self.dates = [] self.convertedDates = [] self.actualValues = [] self.predictedValues = [] self.actualLines = [] self.predictedLines = [] self.linesInitialized = False self.graphs = [] plotCount = len(self.names) plotHeight = max(plotCount * 3, 6) fig = plt.figure(figsize=(14, plotHeight)) gs = gridspec.GridSpec(plotCount, 1) for index in range(len(self.names)): self.graphs.append(fig.add_subplot(gs[index, 0])) plt.title(self.names[index]) plt.ylabel('Frequency Bucket') plt.xlabel('Seconds') plt.tight_layout()
Example 13
Project: nupic.critic Author: htm-community File: nupic_output.py License: GNU Affero General Public License v3.0 | 6 votes |
def initializeLines(self, timestamps): for index in range(len(self.names)): print "initializing %s" % self.names[index] # graph = self.graphs[index] self.dates.append(deque([timestamps[index]] * WINDOW, maxlen=WINDOW)) # print self.dates[index] # self.convertedDates.append(deque( # [date2num(date) for date in self.dates[index]], maxlen=WINDOW # )) self.actualValues.append(deque([0.0] * WINDOW, maxlen=WINDOW)) self.predictedValues.append(deque([0.0] * WINDOW, maxlen=WINDOW)) actualPlot, = self.graphs[index].plot( self.dates[index], self.actualValues[index] ) self.actualLines.append(actualPlot) predictedPlot, = self.graphs[index].plot( self.dates[index], self.predictedValues[index] ) self.predictedLines.append(predictedPlot) self.linesInitialized = True
Example 14
Project: REDPy Author: ahotovec File: plotting.py License: GNU General Public License v3.0 | 6 votes |
def plotFI(dt, fi, mintime): """ Creates subplot for frequency index scatterplot dt: Array containing times of repeaters fi: Array containing frequency index values of repeaters mintime: Minimum time to be plotted """ fig = bokehFigure(title='Frequency Index') fig.yaxis.axis_label = 'FI' fig.circle(matplotlib.dates.num2date(dt[dt>=mintime]), fi[dt>=mintime], color='red', line_alpha=0, size=3, fill_alpha=0.5) return fig
Example 15
Project: Stock-Price-Trade-Analyzer Author: TimRivoli File: PriceTradeAnalyzer.py License: GNU General Public License v3.0 | 6 votes |
def PlotDataFrame(df:pd.DataFrame, title:str, xlabel:str, ylabel:str, adjustScale:bool=True, fileName:str = '', dpi:int = 600): if df.shape[0] >= 4: PlotInitDefaults() ax=df.plot(title=title, linewidth=.75) ax.set_xlabel(xlabel) ax.set_ylabel(ylabel) ax.tick_params(axis='x', rotation=70) ax.grid(b=True, which='major', color='black', linestyle='solid', linewidth=.5) ax.grid(b=True, which='minor', color='0.65', linestyle='solid', linewidth=.3) if adjustScale: dates= df.index.get_level_values('Date') minDate = dates.min() maxDate = dates.max() PlotScalerDateAdjust(minDate, maxDate, ax) if not fileName =='': if not fileName[-4] == '.': fileName+= '.png' plt.savefig(fileName, dpi=dpi) else: fig = plt.figure(1) fig.canvas.set_window_title(title) plt.show() plt.close('all')
Example 16
Project: Stock-Trading-Visualization Author: notadamking File: StockTradingGraph.py License: MIT License | 6 votes |
def _render_volume(self, current_step, net_worth, dates, step_range): self.volume_ax.clear() volume = np.array(self.df['Volume'].values[step_range]) pos = self.df['Open'].values[step_range] - \ self.df['Close'].values[step_range] < 0 neg = self.df['Open'].values[step_range] - \ self.df['Close'].values[step_range] > 0 # Color volume bars based on price direction on that date self.volume_ax.bar(dates[pos], volume[pos], color=UP_COLOR, alpha=0.4, width=1, align='center') self.volume_ax.bar(dates[neg], volume[neg], color=DOWN_COLOR, alpha=0.4, width=1, align='center') # Cap volume axis height below price chart and hide ticks self.volume_ax.set_ylim(0, max(volume) / VOLUME_CHART_HEIGHT) self.volume_ax.yaxis.set_ticks([])
Example 17
Project: Stock-Trading-Visualization Author: notadamking File: StockTradingGraph.py License: MIT License | 6 votes |
def render(self, current_step, net_worth, trades, window_size=40): self.net_worths[current_step] = net_worth window_start = max(current_step - window_size, 0) step_range = range(window_start, current_step + 1) # Format dates as timestamps, necessary for candlestick graph dates = np.array([date2num(x) for x in self.df['Date'].values[step_range]]) self._render_net_worth(current_step, net_worth, step_range, dates) self._render_price(current_step, net_worth, dates, step_range) self._render_volume(current_step, net_worth, dates, step_range) self._render_trades(current_step, trades, step_range) # Format the date ticks to be more easily read self.price_ax.set_xticklabels(self.df['Date'].values[step_range], rotation=45, horizontalalignment='right') # Hide duplicate net worth date labels plt.setp(self.net_worth_ax.get_xticklabels(), visible=False) # Necessary to view frames before they are unrendered plt.pause(0.001)
Example 18
Project: numpyro Author: pyro-ppl File: stochastic_volatility.py License: Apache License 2.0 | 6 votes |
def print_results(posterior, dates): def _print_row(values, row_name=''): quantiles = jnp.array([0.2, 0.4, 0.5, 0.6, 0.8]) row_name_fmt = '{:>8}' header_format = row_name_fmt + '{:>12}' * 5 row_format = row_name_fmt + '{:>12.3f}' * 5 columns = ['(p{})'.format(q * 100) for q in quantiles] q_values = jnp.quantile(values, quantiles, axis=0) print(header_format.format('', *columns)) print(row_format.format(row_name, *q_values)) print('\n') print('=' * 20, 'sigma', '=' * 20) _print_row(posterior['sigma']) print('=' * 20, 'nu', '=' * 20) _print_row(posterior['nu']) print('=' * 20, 'volatility', '=' * 20) for i in range(0, len(dates), 180): _print_row(jnp.exp(posterior['s'][:, i]), dates[i])
Example 19
Project: Openroast Author: Roastero File: customqtwidgets.py License: GNU General Public License v3.0 | 6 votes |
def save_roast_graph_csv(self): try: file_name = QtWidgets.QFileDialog.getSaveFileName( QtWidgets.QWidget(), 'Save Roast Graph CSV', os.path.expanduser('~/'), 'CSV (*.csv);;All Files (*)') with open(file_name[0], 'w') as outfile: outfile.write("Seconds,Temperature\n") if not self.graphXValueList: return init_time = matplotlib.dates.num2date(self.graphXValueList[0]) for x_val,y_val in zip(self.graphXValueList,self.graphYValueList): x_time = matplotlib.dates.num2date(x_val) elapsed_seconds = (x_time - init_time).seconds outfile.write("{0},{1}\n".format(elapsed_seconds, y_val)) except FileNotFoundError: # Occurs if file browser is canceled pass else: pass
Example 20
Project: coffeegrindsize Author: jgagneastro File: dates.py License: MIT License | 6 votes |
def datestr2num(d, default=None): """ Convert a date string to a datenum using :func:`dateutil.parser.parse`. Parameters ---------- d : string or sequence of strings The dates to convert. default : datetime instance, optional The default date to use when fields are missing in *d*. """ if isinstance(d, str): dt = dateutil.parser.parse(d, default=default) return date2num(dt) else: if default is not None: d = [dateutil.parser.parse(s, default=default) for s in d] d = np.asarray(d) if not d.size: return d return date2num(_dateutil_parser_parse_np_vectorized(d))
Example 21
Project: coffeegrindsize Author: jgagneastro File: dates.py License: MIT License | 6 votes |
def tick_values(self, vmin, vmax): delta = relativedelta(vmax, vmin) # We need to cap at the endpoints of valid datetime try: start = vmin - delta except (ValueError, OverflowError): start = _from_ordinalf(1.0) try: stop = vmax + delta except (ValueError, OverflowError): # The magic number! stop = _from_ordinalf(3652059.9999999) self.rule.set(dtstart=start, until=stop) dates = self.rule.between(vmin, vmax, True) if len(dates) == 0: return date2num([vmin, vmax]) return self.raise_if_exceeds(date2num(dates))
Example 22
Project: coffeegrindsize Author: jgagneastro File: dates.py License: MIT License | 6 votes |
def __init__(self, byweekday=1, interval=1, tz=None): """ Mark every weekday in *byweekday*; *byweekday* can be a number or sequence. Elements of *byweekday* must be one of MO, TU, WE, TH, FR, SA, SU, the constants from :mod:`dateutil.rrule`, which have been imported into the :mod:`matplotlib.dates` namespace. *interval* specifies the number of weeks to skip. For example, ``interval=2`` plots every second week. """ if isinstance(byweekday, np.ndarray): # This fixes a bug in dateutil <= 2.3 which prevents the use of # numpy arrays in (among other things) the bymonthday, byweekday # and bymonth parameters. [x.item() for x in byweekday.astype(int)] rule = rrulewrapper(DAILY, byweekday=byweekday, interval=interval, **self.hms0d) RRuleLocator.__init__(self, rule, tz)
Example 23
Project: CogAlg Author: boris-kz File: dates.py License: MIT License | 6 votes |
def _dt64_to_ordinalf(d): """ Convert `numpy.datetime64` or an ndarray of those types to Gregorian date as UTC float. Roundoff is via float64 precision. Practically: microseconds for dates between 290301 BC, 294241 AD, milliseconds for larger dates (see `numpy.datetime64`). Nanoseconds aren't possible because we do times compared to ``0001-01-01T00:00:00`` (plus one day). """ # the "extra" ensures that we at least allow the dynamic range out to # seconds. That should get out to +/-2e11 years. extra = (d - d.astype('datetime64[s]')).astype('timedelta64[ns]') t0 = np.datetime64('0001-01-01T00:00:00', 's') dt = (d.astype('datetime64[s]') - t0).astype(np.float64) dt += extra.astype(np.float64) / 1.0e9 dt = dt / SEC_PER_DAY + 1.0 NaT_int = np.datetime64('NaT').astype(np.int64) d_int = d.astype(np.int64) try: dt[d_int == NaT_int] = np.nan except TypeError: if d_int == NaT_int: dt = np.nan return dt
Example 24
Project: CogAlg Author: boris-kz File: dates.py License: MIT License | 6 votes |
def datestr2num(d, default=None): """ Convert a date string to a datenum using :func:`dateutil.parser.parse`. Parameters ---------- d : string or sequence of strings The dates to convert. default : datetime instance, optional The default date to use when fields are missing in *d*. """ if isinstance(d, str): dt = dateutil.parser.parse(d, default=default) return date2num(dt) else: if default is not None: d = [dateutil.parser.parse(s, default=default) for s in d] d = np.asarray(d) if not d.size: return d return date2num(_dateutil_parser_parse_np_vectorized(d))
Example 25
Project: CogAlg Author: boris-kz File: dates.py License: MIT License | 6 votes |
def tick_values(self, vmin, vmax): delta = relativedelta(vmax, vmin) # We need to cap at the endpoints of valid datetime try: start = vmin - delta except (ValueError, OverflowError): start = _from_ordinalf(1.0) try: stop = vmax + delta except (ValueError, OverflowError): # The magic number! stop = _from_ordinalf(3652059.9999999) self.rule.set(dtstart=start, until=stop) dates = self.rule.between(vmin, vmax, True) if len(dates) == 0: return date2num([vmin, vmax]) return self.raise_if_exceeds(date2num(dates))
Example 26
Project: CogAlg Author: boris-kz File: dates.py License: MIT License | 6 votes |
def __init__(self, byweekday=1, interval=1, tz=None): """ Mark every weekday in *byweekday*; *byweekday* can be a number or sequence. Elements of *byweekday* must be one of MO, TU, WE, TH, FR, SA, SU, the constants from :mod:`dateutil.rrule`, which have been imported into the :mod:`matplotlib.dates` namespace. *interval* specifies the number of weeks to skip. For example, ``interval=2`` plots every second week. """ if isinstance(byweekday, np.ndarray): # This fixes a bug in dateutil <= 2.3 which prevents the use of # numpy arrays in (among other things) the bymonthday, byweekday # and bymonth parameters. [x.item() for x in byweekday.astype(int)] rule = rrulewrapper(DAILY, byweekday=byweekday, interval=interval, **self.hms0d) RRuleLocator.__init__(self, rule, tz)
Example 27
Project: twitter-stock-recommendation Author: alvarobartt File: dates.py License: MIT License | 6 votes |
def datestr2num(d, default=None): """ Convert a date string to a datenum using :func:`dateutil.parser.parse`. Parameters ---------- d : string or sequence of strings The dates to convert. default : datetime instance, optional The default date to use when fields are missing in *d*. """ if isinstance(d, six.string_types): dt = dateutil.parser.parse(d, default=default) return date2num(dt) else: if default is not None: d = [dateutil.parser.parse(s, default=default) for s in d] d = np.asarray(d) if not d.size: return d return date2num(_dateutil_parser_parse_np_vectorized(d))
Example 28
Project: twitter-stock-recommendation Author: alvarobartt File: dates.py License: MIT License | 6 votes |
def tick_values(self, vmin, vmax): delta = relativedelta(vmax, vmin) # We need to cap at the endpoints of valid datetime try: start = vmin - delta except (ValueError, OverflowError): start = _from_ordinalf(1.0) try: stop = vmax + delta except (ValueError, OverflowError): # The magic number! stop = _from_ordinalf(3652059.9999999) self.rule.set(dtstart=start, until=stop) dates = self.rule.between(vmin, vmax, True) if len(dates) == 0: return date2num([vmin, vmax]) return self.raise_if_exceeds(date2num(dates))
Example 29
Project: twitter-stock-recommendation Author: alvarobartt File: dates.py License: MIT License | 6 votes |
def __init__(self, byweekday=1, interval=1, tz=None): """ Mark every weekday in *byweekday*; *byweekday* can be a number or sequence. Elements of *byweekday* must be one of MO, TU, WE, TH, FR, SA, SU, the constants from :mod:`dateutil.rrule`, which have been imported into the :mod:`matplotlib.dates` namespace. *interval* specifies the number of weeks to skip. For example, ``interval=2`` plots every second week. """ if isinstance(byweekday, np.ndarray): # This fixes a bug in dateutil <= 2.3 which prevents the use of # numpy arrays in (among other things) the bymonthday, byweekday # and bymonth parameters. [x.item() for x in byweekday.astype(int)] rule = rrulewrapper(DAILY, byweekday=byweekday, interval=interval, **self.hms0d) RRuleLocator.__init__(self, rule, tz)
Example 30
Project: reddit-hot-recorder Author: 1-Sisyphe File: hotplot.py License: MIT License | 5 votes |
def plot_collec(data_collec,maxups=None, maxage=None,maxcoms=None): ''' Prepares the max... args to make sure that the highest value of the axis and the max color of the color map covers all the data_collec. Prepares the timeline_data required for plotting the timeline. Then, launch the loop to plot each data point. ''' if not maxups: maxups = max([max(d['ups']) for d in data_collec]) if not maxcoms: maxcoms = max([max(d['coms']) for d in data_collec]) if not maxage: maxage = max([max(d['ages']) for d in data_collec]) nbr_zfill = len(str(len(data_collec))) timeline = { 'ups':[mean(data['ups']) for data in data_collec], 'coms':[mean(data['coms']) for data in data_collec], 'dates':[datetime.strptime(data['timestamp'],"%b %d %Y %H:%M:%S") for data in data_collec], 'ages': [mean(data['ages']) for data in data_collec] } n=1 for data in data_collec: filename = str(n).zfill(nbr_zfill)+'.png' plot_data(data,filename=filename,maxups=maxups, maxage=maxage,maxcoms=maxcoms,show=False, timeline = timeline) n+=1