def _quarterly_finder(vmin, vmax, freq, aslocator): if get_freq_group(freq) != _c.FR_QTR: raise ValueError("Unexpected frequency") periodsperyear = 4 (vmin, vmax) = (int(vmin), int(vmax)) span = vmax - vmin + 1 #............................................ dates = numpy.arange(vmin, vmax+1) format = numpy.empty(span, dtype="|S8") format.flat = '' year_start = (dates % 4 == 1).nonzero()[0] #............................................ if span <= 3.5 * periodsperyear: if aslocator: major = dates[year_start] minor = dates else: format[:] = 'Q%q' format[year_start] = 'Q%q\n%F' if not has_level_label(year_start): if dates.size > 1: idx = 1 else: idx = 0 format[idx] = 'Q%q\n%F' #............................................ elif span <= 11 * periodsperyear: if aslocator: major = dates[year_start] minor = dates else: format[year_start] = '%F' #............................................ else: years = dates[year_start]//4 + 1 nyears = span/periodsperyear (min_anndef, maj_anndef) = _get_default_annual_spacing(nyears) major_idx = year_start[(years % maj_anndef == 0)] if aslocator: major = dates[major_idx] minor = dates[year_start[(years % min_anndef == 0)]] else: format[major_idx] = '%F' #............................................ if aslocator: return minor, major else: formatted = (format != '') return dict([(d,f) for (d,f) in zip(dates[formatted],format[formatted])])
def __init__(self, freq, minor_locator=False, dynamic_mode=True,): self.format = None self.freq = freq self.locs = [] self.formatdict = {} self.isminor = minor_locator self.isdynamic = dynamic_mode self.offset = 0 fgroup = get_freq_group(freq) #..... if fgroup == _c.FR_ANN: self.finder = _annual_finder elif fgroup == _c.FR_QTR: self.finder = _quarterly_finder elif freq == _c.FR_MTH: self.finder = _monthly_finder elif freq in (_c.FR_BUS, _c.FR_DAY) or fgroup == _c.FR_WK: self.finder = _daily_finder
def __init__(self, freq, minor_locator=False, dynamic_mode=True, base=1, quarter=1, month=1, day=1): self.freq = freq self.base = base fgroup = get_freq_group(freq) (self.quarter, self.month, self.day) = (quarter, month, day) self.isminor = minor_locator self.isdynamic = dynamic_mode self.offset = 0 #..... if fgroup == _c.FR_ANN: self.finder = _annual_finder elif fgroup == _c.FR_QTR: self.finder = _quarterly_finder elif freq == _c.FR_MTH: self.finder = _monthly_finder elif freq in (_c.FR_BUS, _c.FR_DAY) or fgroup == _c.FR_WK: self.finder = _daily_finder
def _annual_finder(vmin, vmax, freq, aslocator): if get_freq_group(freq) != _c.FR_ANN: raise ValueError("Unexpected frequency") (vmin, vmax) = (int(vmin), int(vmax+1)) span = vmax - vmin + 1 #............................................ dates = numpy.arange(vmin, vmax+1) format = numpy.empty(span, dtype="|S8") format.flat = '' #............................................ (min_anndef, maj_anndef) = _get_default_annual_spacing(span) major_idx = dates % maj_anndef == 0 if aslocator: major = dates[major_idx] minor = dates[(dates % min_anndef == 0)] else: format[major_idx] = '%Y' #............................................ if aslocator: return minor, major else: formatted = (format != '') return dict([(d,f) for (d,f) in zip(dates[formatted],format[formatted])])
def _daily_finder(vmin, vmax, freq, aslocator): if freq == _c.FR_BUS: periodsperyear = 261 periodspermonth = 19 elif freq == _c.FR_DAY: periodsperyear = 365 periodspermonth = 28 elif get_freq_group(freq) == _c.FR_WK: periodsperyear = 52 periodspermonth = 3 else: raise ValueError("unexpected frequency") (vmin, vmax) = (int(vmin), int(vmax)) span = vmax - vmin + 1 dates = date_array(start_date=Date(freq,vmin), end_date=Date(freq, vmax)) default = numpy.arange(vmin, vmax+1) # Initialize the output if not aslocator: format = numpy.empty(default.shape, dtype="|S10") format.flat = '' def first_label(label_flags): if label_flags[0] == 0: return label_flags[1] else: return label_flags[0] # Case 1. Less than a month if span <= periodspermonth: month_start = period_break(dates,'month') if aslocator: major = default[month_start] minor = default else: year_start = period_break(dates,'year') format[:] = '%d' format[month_start] = '%d\n%b' format[year_start] = '%d\n%b\n%Y' if not has_level_label(year_start): if not has_level_label(month_start): if dates.size > 1: idx = 1 else: idx = 0 format[idx] = '%d\n%b\n%Y' else: format[first_label(month_start)] = '%d\n%b\n%Y' # Case 2. Less than three months elif span <= periodsperyear//4: month_start = period_break(dates,'month') if aslocator: major = default[month_start] minor = default else: week_start = period_break(dates,'week') year_start = period_break(dates,'year') format[week_start] = '%d' format[month_start] = '\n\n%b' format[year_start] = '\n\n%b\n%Y' if not has_level_label(year_start): if not has_level_label(month_start): format[first_label(week_start)] = '\n\n%b\n%Y' else: format[first_label(month_start)] = '\n\n%b\n%Y' # Case 3. Less than 14 months ............... elif span <= 1.15 * periodsperyear: if aslocator: d_minus_1 = dates-1 month_diff = numpy.abs(dates.month - d_minus_1.month) week_diff = numpy.abs(dates.week - d_minus_1.week) minor_idx = (month_diff + week_diff).nonzero()[0] major = default[month_diff != 0] minor = default[minor_idx] else: year_start = period_break(dates,'year') month_start = period_break(dates,'month') format[month_start] = '%b' format[year_start] = '%b\n%Y' if not has_level_label(year_start): format[first_label(month_start)] = '%b\n%Y' # Case 4. Less than 2.5 years ............... elif span <= 2.5 * periodsperyear: year_start = period_break(dates,'year') if aslocator: month_start = period_break(dates, 'quarter') major = default[year_start] minor = default[month_start] else: quarter_start = period_break(dates, 'quarter') format[quarter_start] = '%b' format[year_start] = '%b\n%Y' # Case 4. Less than 4 years ................. elif span <= 4 * periodsperyear: year_start = period_break(dates,'year') month_start = period_break(dates, 'month') if aslocator: major = default[year_start] minor = default[month_start] else: month_break = dates[month_start].month jan_or_jul = month_start[(month_break == 1) | (month_break == 7)] format[jan_or_jul] = '%b' format[year_start] = '%b\n%Y' # Case 5. Less than 11 years ................ elif span <= 11 * periodsperyear: year_start = period_break(dates,'year') if aslocator: quarter_start = period_break(dates, 'quarter') major = default[year_start] minor = default[quarter_start] else: format[year_start] = '%Y' # Case 6. More than 12 years ................ else: year_start = period_break(dates,'year') year_break = dates[year_start].years nyears = span/periodsperyear (min_anndef, maj_anndef) = _get_default_annual_spacing(nyears) major_idx = year_start[(year_break % maj_anndef == 0)] if aslocator: major = default[major_idx] minor_idx = year_start[(year_break % min_anndef == 0)] minor = default[minor_idx] else: format[major_idx] = '%Y' #............................................ if aslocator: return minor, major else: formatted = (format != '') return dict([(d,f) for (d,f) in zip(default[formatted],format[formatted])])