def _get_time_bins(self, axis): assert isinstance(axis, DatetimeIndex) if len(axis) == 0: binner = labels = DatetimeIndex(data=[], freq=self.freq) return binner, [], labels first, last = _get_range_edges(axis, self.freq, closed=self.closed, base=self.base) binner = labels = DatetimeIndex(freq=self.freq, start=first, end=last) # a little hack trimmed = False if len(binner) > 2 and binner[-2] == axis[-1] and self.closed == "right": binner = binner[:-1] trimmed = True ax_values = axis.asi8 binner, bin_edges = self._adjust_bin_edges(binner, ax_values) # general version, knowing nothing about relative frequencies bins = lib.generate_bins_dt64(ax_values, bin_edges, self.closed) if self.closed == "right": labels = binner if self.label == "right": labels = labels[1:] elif not trimmed: labels = labels[:-1] else: if self.label == "right": labels = labels[1:] elif not trimmed: labels = labels[:-1] return binner, bins, labels
def _get_time_bins(self, axis): assert (isinstance(axis, DatetimeIndex)) if len(axis) == 0: binner = labels = DatetimeIndex(data=[], freq=self.freq) return binner, [], labels first, last = _get_range_edges(axis, self.begin, self.end, self.freq, closed=self.closed, base=self.base) binner = DatetimeIndex(freq=self.freq, start=first, end=last) # a little hack trimmed = False if len(binner) > 2 and binner[-2] == axis[-1]: binner = binner[:-1] trimmed = True # general version, knowing nothing about relative frequencies bins = lib.generate_bins_dt64(axis.asi8, binner.asi8, self.closed) if self.label == 'right': labels = binner[1:] elif not trimmed: labels = binner[:-1] else: labels = binner return binner, bins, labels
def _get_time_bins(self, axis): assert(isinstance(axis, DatetimeIndex)) if len(axis) == 0: binner = labels = DatetimeIndex(data=[], freq=self.freq) return binner, [], labels first, last = _get_range_edges(axis, self.begin, self.end, self.freq, closed=self.closed, base=self.base) binner = DatetimeIndex(freq=self.freq, start=first, end=last) # a little hack trimmed = False if len(binner) > 2 and binner[-2] == axis[-1]: binner = binner[:-1] trimmed = True # general version, knowing nothing about relative frequencies bins = lib.generate_bins_dt64(axis.asi8, binner.asi8, self.closed) if self.label == 'right': labels = binner[1:] elif not trimmed: labels = binner[:-1] else: labels = binner return binner, bins, labels
def _get_time_bins(self, ax): if not isinstance(ax, DatetimeIndex): raise TypeError('axis must be a DatetimeIndex, but got ' 'an instance of %r' % type(ax).__name__) if len(ax) == 0: binner = labels = DatetimeIndex( data=[], freq=self.freq, name=ax.name) return binner, [], labels first, last = ax.min(), ax.max() first, last = _get_range_edges(first, last, self.freq, closed=self.closed, base=self.base) tz = ax.tz binner = labels = DatetimeIndex(freq=self.freq, start=first.replace(tzinfo=None), end=last.replace(tzinfo=None), tz=tz, name=ax.name) # a little hack trimmed = False if (len(binner) > 2 and binner[-2] == last and self.closed == 'right'): binner = binner[:-1] trimmed = True ax_values = ax.asi8 binner, bin_edges = self._adjust_bin_edges(binner, ax_values) # general version, knowing nothing about relative frequencies bins = lib.generate_bins_dt64( ax_values, bin_edges, self.closed, hasnans=ax.hasnans) if self.closed == 'right': labels = binner if self.label == 'right': labels = labels[1:] elif not trimmed: labels = labels[:-1] else: if self.label == 'right': labels = labels[1:] elif not trimmed: labels = labels[:-1] if ax.hasnans: binner = binner.insert(0, tslib.NaT) labels = labels.insert(0, tslib.NaT) # if we end up with more labels than bins # adjust the labels # GH4076 if len(bins) < len(labels): labels = labels[:len(bins)] return binner, bins, labels
def _get_time_bins(self, ax): if not isinstance(ax, DatetimeIndex): raise TypeError('axis must be a DatetimeIndex, but got ' 'an instance of %r' % type(ax).__name__) if len(ax) == 0: binner = labels = DatetimeIndex(data=[], freq=self.freq, name=ax.name) return binner, [], labels first, last = _get_range_edges(ax, self.freq, closed=self.closed, base=self.base) tz = ax.tz binner = labels = DatetimeIndex(freq=self.freq, start=first.replace(tzinfo=None), end=last.replace(tzinfo=None), tz=tz, name=ax.name) # a little hack trimmed = False if (len(binner) > 2 and binner[-2] == ax.max() and self.closed == 'right'): binner = binner[:-1] trimmed = True ax_values = ax.asi8 binner, bin_edges = self._adjust_bin_edges(binner, ax_values) # general version, knowing nothing about relative frequencies bins = lib.generate_bins_dt64(ax_values, bin_edges, self.closed) if self.closed == 'right': labels = binner if self.label == 'right': labels = labels[1:] elif not trimmed: labels = labels[:-1] else: if self.label == 'right': labels = labels[1:] elif not trimmed: labels = labels[:-1] if (ax_values == tslib.iNaT).any(): binner = binner.insert(0, tslib.NaT) labels = labels.insert(0, tslib.NaT) # if we end up with more labels than bins # adjust the labels # GH4076 if len(bins) < len(labels): labels = labels[:len(bins)] return binner, bins, labels
def generate_xticks(self, index, freq): """ Ticks are really just the bin edges. """ start = index[0] end = index[-1] start, end = _get_range_edges(index, offset=freq, closed='right') ind = DatetimeIndex(start=start, end=end, freq=freq) bins = lib.generate_bins_dt64(index.asi8, ind.asi8, closed='right') bins = np.unique(bins) return bins
def _get_time_bins(self, ax): if not isinstance(ax, DatetimeIndex): raise TypeError("axis must be a DatetimeIndex, but got " "an instance of %r" % type(ax).__name__) if len(ax) == 0: binner = labels = DatetimeIndex(data=[], freq=self.freq, name=ax.name) return binner, [], labels first, last = ax.min(), ax.max() first, last = _get_range_edges(first, last, self.freq, closed=self.closed, base=self.base) tz = ax.tz # GH #12037 # use first/last directly instead of call replace() on them # because replace() will swallow the nanosecond part # thus last bin maybe slightly before the end if the end contains # nanosecond part and lead to `Values falls after last bin` error binner = labels = DatetimeIndex(freq=self.freq, start=first, end=last, tz=tz, name=ax.name) # a little hack trimmed = False if len(binner) > 2 and binner[-2] == last and self.closed == "right": binner = binner[:-1] trimmed = True ax_values = ax.asi8 binner, bin_edges = self._adjust_bin_edges(binner, ax_values) # general version, knowing nothing about relative frequencies bins = lib.generate_bins_dt64(ax_values, bin_edges, self.closed, hasnans=ax.hasnans) if self.closed == "right": labels = binner if self.label == "right": labels = labels[1:] elif not trimmed: labels = labels[:-1] else: if self.label == "right": labels = labels[1:] elif not trimmed: labels = labels[:-1] if ax.hasnans: binner = binner.insert(0, tslib.NaT) labels = labels.insert(0, tslib.NaT) # if we end up with more labels than bins # adjust the labels # GH4076 if len(bins) < len(labels): labels = labels[: len(bins)] return binner, bins, labels
def _get_time_bins(self, axis): assert (isinstance(axis, DatetimeIndex)) if len(axis) == 0: binner = labels = DatetimeIndex(data=[], freq=self.freq) return binner, [], labels first, last = _get_range_edges(axis, self.begin, self.end, self.freq, closed=self.closed, base=self.base) binner = labels = DatetimeIndex(freq=self.freq, start=first, end=last) # a little hack trimmed = False if len(binner) > 2 and binner[-2] == axis[-1]: binner = binner[:-1] trimmed = True ax_values = axis.asi8 bin_edges = binner.asi8 # Some hacks for > daily data, see #1471, #1458 if self.freq != 'D' and is_superperiod(self.freq, 'D'): day_nanos = _delta_to_nanoseconds(timedelta(1)) if self.closed == 'right': bin_edges = bin_edges + day_nanos - 1 else: bin_edges = bin_edges + day_nanos # intraday values on last day if bin_edges[-2] > ax_values[-1]: bin_edges = bin_edges[:-1] binner = binner[:-1] # general version, knowing nothing about relative frequencies bins = lib.generate_bins_dt64(ax_values, bin_edges, self.closed) if self.closed == 'right': labels = binner if self.label == 'right': labels = labels[1:] elif not trimmed: labels = labels[:-1] else: if self.label == 'right': labels = labels[1:] elif not trimmed: labels = labels[:-1] return binner, bins, labels
def _get_time_bins(self, axis): assert(isinstance(axis, DatetimeIndex)) if len(axis) == 0: binner = labels = DatetimeIndex(data=[], freq=self.freq) return binner, [], labels first, last = _get_range_edges(axis, self.begin, self.end, self.freq, closed=self.closed, base=self.base) binner = labels = DatetimeIndex(freq=self.freq, start=first, end=last) # a little hack trimmed = False if len(binner) > 2 and binner[-2] == axis[-1]: binner = binner[:-1] trimmed = True ax_values = axis.asi8 bin_edges = binner.asi8 # Some hacks for > daily data, see #1471, #1458 if self.freq != 'D' and is_superperiod(self.freq, 'D'): day_nanos = _delta_to_nanoseconds(timedelta(1)) if self.closed == 'right': bin_edges = bin_edges + day_nanos - 1 else: bin_edges = bin_edges + day_nanos # intraday values on last day if bin_edges[-2] > ax_values[-1]: bin_edges = bin_edges[:-1] binner = binner[:-1] # general version, knowing nothing about relative frequencies bins = lib.generate_bins_dt64(ax_values, bin_edges, self.closed) if self.closed == 'right': labels = binner if self.label == 'right': labels = labels[1:] elif not trimmed: labels = labels[:-1] else: if self.label == 'right': labels = labels[1:] elif not trimmed: labels = labels[:-1] return binner, bins, labels
def anchor_downsample(obj, freq, axis=None): """ Point of this is to fix the freq to regular intervals like 9:30, 9:45, 10:00 and not 9:13, 9:28: 9:43 """ if axis is None: axis = 0 if isinstance(obj, Panel): axis = 1 index = obj._get_axis(axis) ind = get_anchor_index(index, freq) bins = lib.generate_bins_dt64(index.asi8, ind.asi8, closed='right') labels = ind[1:] grouper = BinGrouper(bins, labels) return obj.groupby(grouper)
def _get_time_bins(self, axis): if not isinstance(axis, DatetimeIndex): raise TypeError('axis must be a DatetimeIndex, but got ' 'an instance of %r' % type(axis).__name__) if len(axis) == 0: binner = labels = DatetimeIndex(data=[], freq=self.freq) return binner, [], labels first, last = _get_range_edges(axis, self.freq, closed=self.closed, base=self.base) tz = axis.tz binner = labels = DatetimeIndex(freq=self.freq, start=first.replace(tzinfo=None), end=last.replace(tzinfo=None), tz=tz) # a little hack trimmed = False if (len(binner) > 2 and binner[-2] == axis[-1] and self.closed == 'right'): binner = binner[:-1] trimmed = True ax_values = axis.asi8 binner, bin_edges = self._adjust_bin_edges(binner, ax_values) # general version, knowing nothing about relative frequencies bins = lib.generate_bins_dt64(ax_values, bin_edges, self.closed) if self.closed == 'right': labels = binner if self.label == 'right': labels = labels[1:] elif not trimmed: labels = labels[:-1] else: if self.label == 'right': labels = labels[1:] elif not trimmed: labels = labels[:-1] return binner, bins, labels
def _get_time_bins(self, ax): if not isinstance(ax, DatetimeIndex): raise TypeError('axis must be a DatetimeIndex, but got ' 'an instance of %r' % type(ax).__name__) if len(ax) == 0: binner = labels = DatetimeIndex(data=[], freq=self.freq, name=ax.name) return binner, [], labels first, last = ax.min(), ax.max() first, last = _get_range_edges(first, last, self.freq, closed=self.closed, base=self.base) tz = ax.tz # GH #12037 # use first/last directly instead of call replace() on them # because replace() will swallow the nanosecond part # thus last bin maybe slightly before the end if the end contains # nanosecond part and lead to `Values falls after last bin` error binner = labels = DatetimeIndex(freq=self.freq, start=first, end=last, tz=tz, name=ax.name) # a little hack trimmed = False if (len(binner) > 2 and binner[-2] == last and self.closed == 'right'): binner = binner[:-1] trimmed = True ax_values = ax.asi8 binner, bin_edges = self._adjust_bin_edges(binner, ax_values) # general version, knowing nothing about relative frequencies bins = lib.generate_bins_dt64(ax_values, bin_edges, self.closed, hasnans=ax.hasnans) if self.closed == 'right': labels = binner if self.label == 'right': labels = labels[1:] elif not trimmed: labels = labels[:-1] else: if self.label == 'right': labels = labels[1:] elif not trimmed: labels = labels[:-1] if ax.hasnans: binner = binner.insert(0, tslib.NaT) labels = labels.insert(0, tslib.NaT) # if we end up with more labels than bins # adjust the labels # GH4076 if len(bins) < len(labels): labels = labels[:len(bins)] return binner, bins, labels