Esempio n. 1
0
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])])
Esempio n. 2
0
 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
Esempio n. 3
0
 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
Esempio n. 4
0
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])])
Esempio n. 5
0
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])])