|
| 1 | +# period frequency constants corresponding to scikits timeseries |
| 2 | +# originals |
| 3 | + |
| 4 | + |
| 5 | +cdef class PeriodPseudoDtype: |
| 6 | + """ |
| 7 | + Similar to an actual dtype, this contains all of the information |
| 8 | + describing a PeriodDtype in an integer code. |
| 9 | + """ |
| 10 | + # cdef readonly: |
| 11 | + # PeriodDtypeCode dtype_code |
| 12 | + |
| 13 | + def __cinit__(self, PeriodDtypeCode code): |
| 14 | + self.dtype_code = code |
| 15 | + |
| 16 | + def __eq__(self, other): |
| 17 | + if not isinstance(other, PeriodPseudoDtype): |
| 18 | + return False |
| 19 | + if not isinstance(self, PeriodPseudoDtype): |
| 20 | + # cython semantics, this is a reversed op |
| 21 | + return False |
| 22 | + return self.dtype_code == other.dtype_code |
| 23 | + |
| 24 | + @property |
| 25 | + def date_offset(self): |
| 26 | + """ |
| 27 | + Corresponding DateOffset object. |
| 28 | +
|
| 29 | + This mapping is mainly for backward-compatibility. |
| 30 | + """ |
| 31 | + from .offsets import to_offset |
| 32 | + |
| 33 | + freqstr = _reverse_period_code_map.get(self.dtype_code) |
| 34 | + # equiv: freqstr = libfrequencies.get_freq_str(self.dtype_code) |
| 35 | + |
| 36 | + return to_offset(freqstr) |
| 37 | + |
| 38 | + @classmethod |
| 39 | + def from_date_offset(cls, offset): |
| 40 | + code = offset._period_dtype_code |
| 41 | + return cls(code) |
| 42 | + |
| 43 | + |
| 44 | +_period_code_map = { |
| 45 | + # Annual freqs with various fiscal year ends. |
| 46 | + # eg, 2005 for A-FEB runs Mar 1, 2004 to Feb 28, 2005 |
| 47 | + "A-DEC": 1000, # Annual - December year end |
| 48 | + "A-JAN": 1001, # Annual - January year end |
| 49 | + "A-FEB": 1002, # Annual - February year end |
| 50 | + "A-MAR": 1003, # Annual - March year end |
| 51 | + "A-APR": 1004, # Annual - April year end |
| 52 | + "A-MAY": 1005, # Annual - May year end |
| 53 | + "A-JUN": 1006, # Annual - June year end |
| 54 | + "A-JUL": 1007, # Annual - July year end |
| 55 | + "A-AUG": 1008, # Annual - August year end |
| 56 | + "A-SEP": 1009, # Annual - September year end |
| 57 | + "A-OCT": 1010, # Annual - October year end |
| 58 | + "A-NOV": 1011, # Annual - November year end |
| 59 | + |
| 60 | + # Quarterly frequencies with various fiscal year ends. |
| 61 | + # eg, Q42005 for Q-OCT runs Aug 1, 2005 to Oct 31, 2005 |
| 62 | + "Q-DEC": 2000, # Quarterly - December year end |
| 63 | + "Q-JAN": 2001, # Quarterly - January year end |
| 64 | + "Q-FEB": 2002, # Quarterly - February year end |
| 65 | + "Q-MAR": 2003, # Quarterly - March year end |
| 66 | + "Q-APR": 2004, # Quarterly - April year end |
| 67 | + "Q-MAY": 2005, # Quarterly - May year end |
| 68 | + "Q-JUN": 2006, # Quarterly - June year end |
| 69 | + "Q-JUL": 2007, # Quarterly - July year end |
| 70 | + "Q-AUG": 2008, # Quarterly - August year end |
| 71 | + "Q-SEP": 2009, # Quarterly - September year end |
| 72 | + "Q-OCT": 2010, # Quarterly - October year end |
| 73 | + "Q-NOV": 2011, # Quarterly - November year end |
| 74 | + |
| 75 | + "M": 3000, # Monthly |
| 76 | + |
| 77 | + "W-SUN": 4000, # Weekly - Sunday end of week |
| 78 | + "W-MON": 4001, # Weekly - Monday end of week |
| 79 | + "W-TUE": 4002, # Weekly - Tuesday end of week |
| 80 | + "W-WED": 4003, # Weekly - Wednesday end of week |
| 81 | + "W-THU": 4004, # Weekly - Thursday end of week |
| 82 | + "W-FRI": 4005, # Weekly - Friday end of week |
| 83 | + "W-SAT": 4006, # Weekly - Saturday end of week |
| 84 | + |
| 85 | + "B": 5000, # Business days |
| 86 | + "D": 6000, # Daily |
| 87 | + "H": 7000, # Hourly |
| 88 | + "T": 8000, # Minutely |
| 89 | + "S": 9000, # Secondly |
| 90 | + "L": 10000, # Millisecondly |
| 91 | + "U": 11000, # Microsecondly |
| 92 | + "N": 12000, # Nanosecondly |
| 93 | +} |
| 94 | + |
| 95 | +_reverse_period_code_map = { |
| 96 | + _period_code_map[key]: key for key in _period_code_map} |
| 97 | + |
| 98 | +# Yearly aliases; careful not to put these in _reverse_period_code_map |
| 99 | +_period_code_map.update({"Y" + key[1:]: _period_code_map[key] |
| 100 | + for key in _period_code_map |
| 101 | + if key.startswith("A-")}) |
| 102 | + |
| 103 | +_period_code_map.update({ |
| 104 | + "Q": 2000, # Quarterly - December year end (default quarterly) |
| 105 | + "A": 1000, # Annual |
| 106 | + "W": 4000, # Weekly |
| 107 | + "C": 5000, # Custom Business Day |
| 108 | +}) |
0 commit comments