Skip to content

Commit

Permalink
move period related functions from tslib to period module
Browse files Browse the repository at this point in the history
Moved many import statement to local scope in period module, similar to
tslib. This fixes circular dependency problems.
  • Loading branch information
blbradley committed Feb 17, 2015
1 parent a05115b commit bfa8066
Show file tree
Hide file tree
Showing 9 changed files with 649 additions and 603 deletions.
625 changes: 612 additions & 13 deletions pandas/period.pyx

Large diffs are not rendered by default.

7 changes: 3 additions & 4 deletions pandas/tests/test_tseries.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import pandas.util.testing as tm
from pandas.compat import range, lrange, zip
import pandas.lib as lib
import pandas.period as period
import pandas.algos as algos


Expand Down Expand Up @@ -731,12 +732,10 @@ def test_to_datetime_bijective(self):
class TestPeriodField(tm.TestCase):

def test_get_period_field_raises_on_out_of_range(self):
from pandas import tslib
self.assertRaises(ValueError, tslib.get_period_field, -1, 0, 0)
self.assertRaises(ValueError, period.get_period_field, -1, 0, 0)

def test_get_period_field_array_raises_on_out_of_range(self):
from pandas import tslib
self.assertRaises(ValueError, tslib.get_period_field_arr, -1, np.empty(1), 0)
self.assertRaises(ValueError, period.get_period_field_arr, -1, np.empty(1), 0)

if __name__ == '__main__':
import nose
Expand Down
13 changes: 7 additions & 6 deletions pandas/tseries/frequencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import pandas.core.common as com
import pandas.lib as lib
import pandas.tslib as tslib
import pandas.period as period
from pandas.tslib import Timedelta

class FreqGroup(object):
Expand All @@ -31,12 +32,12 @@ class FreqGroup(object):

class Resolution(object):

RESO_US = tslib.US_RESO
RESO_MS = tslib.MS_RESO
RESO_SEC = tslib.S_RESO
RESO_MIN = tslib.T_RESO
RESO_HR = tslib.H_RESO
RESO_DAY = tslib.D_RESO
RESO_US = period.US_RESO
RESO_MS = period.MS_RESO
RESO_SEC = period.S_RESO
RESO_MIN = period.T_RESO
RESO_HR = period.H_RESO
RESO_DAY = period.D_RESO

_reso_str_map = {
RESO_US: 'microsecond',
Expand Down
3 changes: 2 additions & 1 deletion pandas/tseries/index.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
from pandas.lib import Timestamp
import pandas.lib as lib
import pandas.tslib as tslib
import pandas.period as period
import pandas.algos as _algos
import pandas.index as _index

Expand Down Expand Up @@ -1461,7 +1462,7 @@ def is_normalized(self):

@cache_readonly
def _resolution(self):
return tslib.resolution(self.asi8, self.tz)
return period.resolution(self.asi8, self.tz)

def equals(self, other):
"""
Expand Down
18 changes: 10 additions & 8 deletions pandas/tseries/period.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
import pandas.tseries.offsets as offsets

from pandas.period import Period
import pandas.period as period
from pandas.period import (
get_period_field_arr,
_validate_end_alias,
_quarter_to_myear,
)
Expand All @@ -32,7 +34,7 @@
def _field_accessor(name, alias, docstring=None):
def f(self):
base, mult = _gfc(self.freq)
return tslib.get_period_field_arr(alias, self.values, base)
return get_period_field_arr(alias, self.values, base)
f.__name__ = name
f.__doc__ = docstring
return property(f)
Expand All @@ -41,7 +43,7 @@ def f(self):
def _get_ordinals(data, freq):
f = lambda x: Period(x, freq=freq).ordinal
if isinstance(data[0], Period):
return tslib.extract_ordinals(data, freq)
return period.extract_ordinals(data, freq)
else:
return lib.map_infer(data, f)

Expand All @@ -51,7 +53,7 @@ def dt64arr_to_periodarr(data, freq, tz):
raise ValueError('Wrong dtype: %s' % data.dtype)

base, mult = _gfc(freq)
return tslib.dt64arr_to_periodarr(data.view('i8'), base, tz)
return period.dt64arr_to_periodarr(data.view('i8'), base, tz)

# --- Period index sketch

Expand Down Expand Up @@ -236,7 +238,7 @@ def _from_arraylike(cls, data, freq, tz):
else:
base1, _ = _gfc(data.freq)
base2, _ = _gfc(freq)
data = tslib.period_asfreq_arr(data.values, base1,
data = period.period_asfreq_arr(data.values, base1,
base2, 1)
else:
if freq is None and len(data) > 0:
Expand Down Expand Up @@ -363,7 +365,7 @@ def asfreq(self, freq=None, how='E'):
raise ValueError('Only mult == 1 supported')

end = how == 'E'
new_data = tslib.period_asfreq_arr(self.values, base1, base2, end)
new_data = period.period_asfreq_arr(self.values, base1, base2, end)
return self._simple_new(new_data, self.name, freq=freq)

def to_datetime(self, dayfirst=False):
Expand Down Expand Up @@ -431,7 +433,7 @@ def to_timestamp(self, freq=None, how='start'):
base, mult = _gfc(freq)
new_data = self.asfreq(freq, how)

new_data = tslib.periodarr_to_dt64arr(new_data.values, base)
new_data = period.periodarr_to_dt64arr(new_data.values, base)
return DatetimeIndex(new_data, freq='infer', name=self.name)

def _add_delta(self, other):
Expand Down Expand Up @@ -881,7 +883,7 @@ def _range_from_fields(year=None, month=None, quarter=None, day=None,
year, quarter = _make_field_arrays(year, quarter)
for y, q in zip(year, quarter):
y, m = _quarter_to_myear(y, q, freq)
val = tslib.period_ordinal(y, m, 1, 1, 1, 1, 0, 0, base)
val = period.period_ordinal(y, m, 1, 1, 1, 1, 0, 0, base)
ordinals.append(val)
else:
base, mult = _gfc(freq)
Expand All @@ -890,7 +892,7 @@ def _range_from_fields(year=None, month=None, quarter=None, day=None,

arrays = _make_field_arrays(year, month, day, hour, minute, second)
for y, mth, d, h, mn, s in zip(*arrays):
ordinals.append(tslib.period_ordinal(y, mth, d, h, mn, s, 0, 0, base))
ordinals.append(period.period_ordinal(y, mth, d, h, mn, s, 0, 0, base))

return np.array(ordinals, dtype=np.int64), freq

Expand Down
10 changes: 6 additions & 4 deletions pandas/tseries/tests/test_tslib.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
import numpy as np

from pandas import tslib
from pandas import period
import datetime

from pandas.core.api import Timestamp, Series, Timedelta
from pandas.tslib import period_asfreq, period_ordinal, get_timezone
from pandas.tslib import get_timezone
from pandas.period import period_asfreq, period_ordinal
from pandas.tseries.index import date_range
from pandas.tseries.frequencies import get_freq
import pandas.tseries.offsets as offsets
Expand Down Expand Up @@ -764,11 +766,11 @@ def test_addition_subtraction_preserve_frequency(self):
def test_resolution(self):

for freq, expected in zip(['A', 'Q', 'M', 'D', 'H', 'T', 'S', 'L', 'U'],
[tslib.D_RESO, tslib.D_RESO, tslib.D_RESO, tslib.D_RESO,
tslib.H_RESO, tslib.T_RESO,tslib.S_RESO, tslib.MS_RESO, tslib.US_RESO]):
[period.D_RESO, period.D_RESO, period.D_RESO, period.D_RESO,
period.H_RESO, period.T_RESO, period.S_RESO, period.MS_RESO, period.US_RESO]):
for tz in [None, 'Asia/Tokyo', 'US/Eastern', 'dateutil/US/Eastern']:
idx = date_range(start='2013-04-01', periods=30, freq=freq, tz=tz)
result = tslib.resolution(idx.asi8, idx.tz)
result = period.resolution(idx.asi8, idx.tz)
self.assertEqual(result, expected)


Expand Down
4 changes: 4 additions & 0 deletions pandas/tslib.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,7 @@ from numpy cimport ndarray, int64_t

cdef convert_to_tsobject(object, object, object)
cdef convert_to_timedelta64(object, object, object)
cpdef object maybe_get_tz(object)
cdef bint _is_utc(object)
cdef bint _is_tzlocal(object)
cdef object _get_dst_info(object)
Loading

0 comments on commit bfa8066

Please sign in to comment.