Skip to content

Commit c8dafb5

Browse files
authored
CLN: reorg pandas.tseries (#16040)
* CLN: move pandas/tseries/resample.py -> pandas/core/resample.py closes #13634 * CLN: move pandas.tseries.period -> pandas.core.indexes.period * CLN: move pandas.tseries.tdi -> pandas.core.indexes.timedeltas * CLN: move pandas.tseries.base -> pandas.core.indexes.datetimelike * CLN: pandas.tseries.common -> pandas.core.indexes.accessors * CLN: move pandas.tseries.index -> pandas.core.indexes.datetimes * CLN: move pandas.tseries.timedeltas, pandas.tseries.tools -> pandas.core.tools * move to_numeric to pandas.core.tools.numeric
1 parent d16cce8 commit c8dafb5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+727
-697
lines changed

doc/source/api.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -1761,7 +1761,7 @@ The following methods are available only for ``DataFrameGroupBy`` objects.
17611761

17621762
Resampling
17631763
----------
1764-
.. currentmodule:: pandas.tseries.resample
1764+
.. currentmodule:: pandas.core.resample
17651765

17661766
Resampler objects are returned by resample calls: :func:`pandas.DataFrame.resample`, :func:`pandas.Series.resample`.
17671767

pandas/_libs/period.pyx

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ from tslib cimport (
3434
)
3535

3636
from pandas.tseries import offsets
37-
from pandas.tseries.tools import parse_time_string
37+
from pandas.core.tools.datetimes import parse_time_string
3838
from pandas.tseries import frequencies
3939

4040
cdef int64_t NPY_NAT = util.get_nat()

pandas/_libs/tslib.pyx

+1-1
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,7 @@ class Timestamp(_Timestamp):
502502
"""
503503
Return an period of which this timestamp is an observation.
504504
"""
505-
from pandas.tseries.period import Period
505+
from pandas import Period
506506

507507
if freq is None:
508508
freq = self.freq

pandas/compat/pickle_compat.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,13 @@ def load_reduce(self):
9494
('pandas.indexes.range', 'RangeIndex'):
9595
('pandas.core.indexes.range', 'RangeIndex'),
9696
('pandas.indexes.multi', 'MultiIndex'):
97-
('pandas.core.indexes.multi', 'MultiIndex')
97+
('pandas.core.indexes.multi', 'MultiIndex'),
98+
('pandas.tseries.index', '_new_DatetimeIndex'):
99+
('pandas.core.indexes.datetimes', '_new_DatetimeIndex'),
100+
('pandas.tseries.index', 'DatetimeIndex'):
101+
('pandas.core.indexes.datetimes', 'DatetimeIndex'),
102+
('pandas.tseries.period', 'PeriodIndex'):
103+
('pandas.core.indexes.period', 'PeriodIndex')
98104
}
99105

100106

pandas/core/api.py

+10-7
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@
1111
from pandas.io.formats.format import set_eng_float_format
1212
from pandas.core.index import (Index, CategoricalIndex, Int64Index,
1313
UInt64Index, RangeIndex, Float64Index,
14-
MultiIndex, IntervalIndex)
14+
MultiIndex, IntervalIndex,
15+
TimedeltaIndex, DatetimeIndex,
16+
PeriodIndex, NaT)
17+
from pandas.core.indexes.period import Period, period_range, pnow
18+
from pandas.core.indexes.timedeltas import Timedelta, timedelta_range
19+
from pandas.core.indexes.datetimes import Timestamp, date_range, bdate_range
1520
from pandas.core.indexes.interval import Interval, interval_range
1621

1722
from pandas.core.series import Series
@@ -23,13 +28,11 @@
2328
lreshape, wide_to_long)
2429

2530
from pandas.core.indexing import IndexSlice
26-
from pandas.core.dtypes.cast import to_numeric
31+
from pandas.core.tools.numeric import to_numeric
2732
from pandas.tseries.offsets import DateOffset
28-
from pandas.tseries.tools import to_datetime
29-
from pandas.tseries.index import (DatetimeIndex, Timestamp,
30-
date_range, bdate_range)
31-
from pandas.tseries.tdi import TimedeltaIndex, Timedelta
32-
from pandas.tseries.period import Period, PeriodIndex
33+
from pandas.core.tools.datetimes import to_datetime
34+
from pandas.core.tools.timedeltas import to_timedelta
35+
from pandas.core.resample import TimeGrouper
3336

3437
# see gh-14094.
3538
from pandas.util.depr_module import _DeprecatedModule

pandas/core/computation/pytables.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from pandas.core.computation.ops import is_term, UndefinedVariableError
1515
from pandas.core.computation.expr import BaseExprVisitor
1616
from pandas.core.computation.common import _ensure_decoded
17-
from pandas.tseries.timedeltas import _coerce_scalar_to_timedelta_type
17+
from pandas.core.tools.timedeltas import _coerce_scalar_to_timedelta_type
1818

1919

2020
class Scope(expr.Scope):

pandas/core/datetools.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import warnings
66

7-
from pandas.tseries.tools import *
7+
from pandas.core.tools.datetimes import *
88
from pandas.tseries.offsets import *
99
from pandas.tseries.frequencies import *
1010

pandas/core/dtypes/cast.py

+5-166
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import numpy as np
66
import warnings
77

8-
import pandas as pd
98
from pandas._libs import tslib, lib
109
from pandas._libs.tslib import iNaT
1110
from pandas.compat import string_types, text_type, PY3
@@ -19,8 +18,6 @@
1918
is_integer_dtype,
2019
is_datetime_or_timedelta_dtype,
2120
is_bool_dtype, is_scalar,
22-
is_numeric_dtype, is_decimal,
23-
is_number,
2421
_string_dtypes,
2522
_coerce_to_dtype,
2623
_ensure_int8, _ensure_int16,
@@ -29,7 +26,7 @@
2926
_POSSIBLY_CAST_DTYPES)
3027
from .dtypes import ExtensionDtype, DatetimeTZDtype, PeriodDtype
3128
from .generic import (ABCDatetimeIndex, ABCPeriodIndex,
32-
ABCSeries, ABCIndexClass)
29+
ABCSeries)
3330
from .missing import isnull, notnull
3431
from .inference import is_list_like
3532

@@ -548,7 +545,7 @@ def coerce_to_dtypes(result, dtypes):
548545
if len(result) != len(dtypes):
549546
raise AssertionError("_coerce_to_dtypes requires equal len arrays")
550547

551-
from pandas.tseries.timedeltas import _coerce_scalar_to_timedelta_type
548+
from pandas.core.tools.timedeltas import _coerce_scalar_to_timedelta_type
552549

553550
def conv(r, dtype):
554551
try:
@@ -670,7 +667,7 @@ def maybe_convert_objects(values, convert_dates=True, convert_numeric=True,
670667
if convert_timedeltas and values.dtype == np.object_:
671668

672669
if convert_timedeltas == 'coerce':
673-
from pandas.tseries.timedeltas import to_timedelta
670+
from pandas.core.tools.timedeltas import to_timedelta
674671
new_values = to_timedelta(values, coerce=True)
675672

676673
# if we are all nans then leave me alone
@@ -872,8 +869,8 @@ def maybe_cast_to_datetime(value, dtype, errors='raise'):
872869
""" try to cast the array/value to a datetimelike dtype, converting float
873870
nan to iNaT
874871
"""
875-
from pandas.tseries.timedeltas import to_timedelta
876-
from pandas.tseries.tools import to_datetime
872+
from pandas.core.tools.timedeltas import to_timedelta
873+
from pandas.core.tools.datetimes import to_datetime
877874

878875
if dtype is not None:
879876
if isinstance(dtype, string_types):
@@ -1029,161 +1026,3 @@ def find_common_type(types):
10291026
return np.object
10301027

10311028
return np.find_common_type(types, [])
1032-
1033-
1034-
def to_numeric(arg, errors='raise', downcast=None):
1035-
"""
1036-
Convert argument to a numeric type.
1037-
1038-
Parameters
1039-
----------
1040-
arg : list, tuple, 1-d array, or Series
1041-
errors : {'ignore', 'raise', 'coerce'}, default 'raise'
1042-
- If 'raise', then invalid parsing will raise an exception
1043-
- If 'coerce', then invalid parsing will be set as NaN
1044-
- If 'ignore', then invalid parsing will return the input
1045-
downcast : {'integer', 'signed', 'unsigned', 'float'} , default None
1046-
If not None, and if the data has been successfully cast to a
1047-
numerical dtype (or if the data was numeric to begin with),
1048-
downcast that resulting data to the smallest numerical dtype
1049-
possible according to the following rules:
1050-
1051-
- 'integer' or 'signed': smallest signed int dtype (min.: np.int8)
1052-
- 'unsigned': smallest unsigned int dtype (min.: np.uint8)
1053-
- 'float': smallest float dtype (min.: np.float32)
1054-
1055-
As this behaviour is separate from the core conversion to
1056-
numeric values, any errors raised during the downcasting
1057-
will be surfaced regardless of the value of the 'errors' input.
1058-
1059-
In addition, downcasting will only occur if the size
1060-
of the resulting data's dtype is strictly larger than
1061-
the dtype it is to be cast to, so if none of the dtypes
1062-
checked satisfy that specification, no downcasting will be
1063-
performed on the data.
1064-
1065-
.. versionadded:: 0.19.0
1066-
1067-
Returns
1068-
-------
1069-
ret : numeric if parsing succeeded.
1070-
Return type depends on input. Series if Series, otherwise ndarray
1071-
1072-
Examples
1073-
--------
1074-
Take separate series and convert to numeric, coercing when told to
1075-
1076-
>>> import pandas as pd
1077-
>>> s = pd.Series(['1.0', '2', -3])
1078-
>>> pd.to_numeric(s)
1079-
0 1.0
1080-
1 2.0
1081-
2 -3.0
1082-
dtype: float64
1083-
>>> pd.to_numeric(s, downcast='float')
1084-
0 1.0
1085-
1 2.0
1086-
2 -3.0
1087-
dtype: float32
1088-
>>> pd.to_numeric(s, downcast='signed')
1089-
0 1
1090-
1 2
1091-
2 -3
1092-
dtype: int8
1093-
>>> s = pd.Series(['apple', '1.0', '2', -3])
1094-
>>> pd.to_numeric(s, errors='ignore')
1095-
0 apple
1096-
1 1.0
1097-
2 2
1098-
3 -3
1099-
dtype: object
1100-
>>> pd.to_numeric(s, errors='coerce')
1101-
0 NaN
1102-
1 1.0
1103-
2 2.0
1104-
3 -3.0
1105-
dtype: float64
1106-
"""
1107-
if downcast not in (None, 'integer', 'signed', 'unsigned', 'float'):
1108-
raise ValueError('invalid downcasting method provided')
1109-
1110-
is_series = False
1111-
is_index = False
1112-
is_scalars = False
1113-
1114-
if isinstance(arg, ABCSeries):
1115-
is_series = True
1116-
values = arg.values
1117-
elif isinstance(arg, ABCIndexClass):
1118-
is_index = True
1119-
values = arg.asi8
1120-
if values is None:
1121-
values = arg.values
1122-
elif isinstance(arg, (list, tuple)):
1123-
values = np.array(arg, dtype='O')
1124-
elif is_scalar(arg):
1125-
if is_decimal(arg):
1126-
return float(arg)
1127-
if is_number(arg):
1128-
return arg
1129-
is_scalars = True
1130-
values = np.array([arg], dtype='O')
1131-
elif getattr(arg, 'ndim', 1) > 1:
1132-
raise TypeError('arg must be a list, tuple, 1-d array, or Series')
1133-
else:
1134-
values = arg
1135-
1136-
try:
1137-
if is_numeric_dtype(values):
1138-
pass
1139-
elif is_datetime_or_timedelta_dtype(values):
1140-
values = values.astype(np.int64)
1141-
else:
1142-
values = _ensure_object(values)
1143-
coerce_numeric = False if errors in ('ignore', 'raise') else True
1144-
values = lib.maybe_convert_numeric(values, set(),
1145-
coerce_numeric=coerce_numeric)
1146-
1147-
except Exception:
1148-
if errors == 'raise':
1149-
raise
1150-
1151-
# attempt downcast only if the data has been successfully converted
1152-
# to a numerical dtype and if a downcast method has been specified
1153-
if downcast is not None and is_numeric_dtype(values):
1154-
typecodes = None
1155-
1156-
if downcast in ('integer', 'signed'):
1157-
typecodes = np.typecodes['Integer']
1158-
elif downcast == 'unsigned' and np.min(values) >= 0:
1159-
typecodes = np.typecodes['UnsignedInteger']
1160-
elif downcast == 'float':
1161-
typecodes = np.typecodes['Float']
1162-
1163-
# pandas support goes only to np.float32,
1164-
# as float dtypes smaller than that are
1165-
# extremely rare and not well supported
1166-
float_32_char = np.dtype(np.float32).char
1167-
float_32_ind = typecodes.index(float_32_char)
1168-
typecodes = typecodes[float_32_ind:]
1169-
1170-
if typecodes is not None:
1171-
# from smallest to largest
1172-
for dtype in typecodes:
1173-
if np.dtype(dtype).itemsize <= values.dtype.itemsize:
1174-
values = maybe_downcast_to_dtype(values, dtype)
1175-
1176-
# successful conversion
1177-
if values.dtype == dtype:
1178-
break
1179-
1180-
if is_series:
1181-
return pd.Series(values, index=arg.index, name=arg.name)
1182-
elif is_index:
1183-
# because we want to coerce to numeric if possible,
1184-
# do not use _shallow_copy_with_infer
1185-
return pd.Index(values, name=arg.name)
1186-
elif is_scalars:
1187-
return values[0]
1188-
else:
1189-
return values

pandas/core/frame.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@
8282
from pandas.util.decorators import Appender, Substitution
8383
from pandas.util.validators import validate_bool_kwarg
8484

85-
from pandas.tseries.period import PeriodIndex
86-
from pandas.tseries.index import DatetimeIndex
87-
from pandas.tseries.tdi import TimedeltaIndex
85+
from pandas.core.indexes.period import PeriodIndex
86+
from pandas.core.indexes.datetimes import DatetimeIndex
87+
from pandas.core.indexes.timedeltas import TimedeltaIndex
8888

8989
import pandas.core.base as base
9090
import pandas.core.common as com

pandas/core/generic.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@
3737
from pandas.core.index import (Index, MultiIndex, _ensure_index,
3838
InvalidIndexError)
3939
import pandas.core.indexing as indexing
40-
from pandas.tseries.index import DatetimeIndex
41-
from pandas.tseries.period import PeriodIndex, Period
40+
from pandas.core.indexes.datetimes import DatetimeIndex
41+
from pandas.core.indexes.period import PeriodIndex, Period
4242
from pandas.core.internals import BlockManager
4343
import pandas.core.algorithms as algos
4444
import pandas.core.common as com
@@ -4363,7 +4363,7 @@ def asfreq(self, freq, method=None, how=None, normalize=False,
43634363
To learn more about the frequency strings, please see `this link
43644364
<http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases>`__.
43654365
"""
4366-
from pandas.tseries.resample import asfreq
4366+
from pandas.core.resample import asfreq
43674367
return asfreq(self, freq, method=method, how=how, normalize=normalize,
43684368
fill_value=fill_value)
43694369

@@ -4573,8 +4573,8 @@ def resample(self, rule, how=None, axis=0, fill_method=None, closed=None,
45734573
2000-01-01 00:00:00 0 6 12 18
45744574
2000-01-01 00:03:00 0 4 8 12
45754575
"""
4576-
from pandas.tseries.resample import (resample,
4577-
_maybe_process_deprecations)
4576+
from pandas.core.resample import (resample,
4577+
_maybe_process_deprecations)
45784578
axis = self._get_axis_number(axis)
45794579
r = resample(self, freq=rule, label=label, closed=closed,
45804580
axis=axis, kind=kind, loffset=loffset,
@@ -5361,7 +5361,7 @@ def truncate(self, before=None, after=None, axis=None, copy=True):
53615361
# if we have a date index, convert to dates, otherwise
53625362
# treat like a slice
53635363
if ax.is_all_dates:
5364-
from pandas.tseries.tools import to_datetime
5364+
from pandas.core.tools.datetimes import to_datetime
53655365
before = to_datetime(before)
53665366
after = to_datetime(after)
53675367

pandas/core/groupby.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ class Grouper(object):
232232

233233
def __new__(cls, *args, **kwargs):
234234
if kwargs.get('freq') is not None:
235-
from pandas.tseries.resample import TimeGrouper
235+
from pandas.core.resample import TimeGrouper
236236
cls = TimeGrouper
237237
return super(Grouper, cls).__new__(cls)
238238

@@ -1227,7 +1227,7 @@ def resample(self, rule, *args, **kwargs):
12271227
Provide resampling when using a TimeGrouper
12281228
Return a new grouper with our resampler appended
12291229
"""
1230-
from pandas.tseries.resample import get_resampler_for_grouping
1230+
from pandas.core.resample import get_resampler_for_grouping
12311231
return get_resampler_for_grouping(self, rule, *args, **kwargs)
12321232

12331233
@Substitution(name='groupby')
@@ -3509,7 +3509,7 @@ def _decide_output_index(self, output, labels):
35093509

35103510
def _wrap_applied_output(self, keys, values, not_indexed_same=False):
35113511
from pandas.core.index import _all_indexes_same
3512-
from pandas.core.dtypes.cast import to_numeric
3512+
from pandas.core.tools.numeric import to_numeric
35133513

35143514
if len(keys) == 0:
35153515
return DataFrame(index=keys)

0 commit comments

Comments
 (0)