Skip to content

Commit d46d2a5

Browse files
jbrockmendelTomAugspurger
authored andcommitted
BUG: do freq validation in DTA.__init__ (pandas-dev#24686)
* do freq validation in DTA.__init__ * troubleshoot parquet fail * troubleshoot feather * troubleshoot pyarrow fail
1 parent bad02e8 commit d46d2a5

File tree

4 files changed

+27
-4
lines changed

4 files changed

+27
-4
lines changed

pandas/core/arrays/datetimelike.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,7 @@ def _concat_same_type(cls, to_concat):
606606

607607
def copy(self, deep=False):
608608
values = self.asi8.copy()
609-
return type(self)(values, dtype=self.dtype, freq=self.freq)
609+
return type(self)._simple_new(values, dtype=self.dtype, freq=self.freq)
610610

611611
def _values_for_factorize(self):
612612
return self.asi8, iNaT

pandas/core/arrays/datetimes.py

+15-2
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,8 @@ def __init__(self, values, dtype=_NS_DTYPE, freq=None, copy=False):
258258
if isinstance(values, (ABCSeries, ABCIndexClass)):
259259
values = values._values
260260

261+
inferred_freq = getattr(values, "_freq", None)
262+
261263
if isinstance(values, type(self)):
262264
# validation
263265
dtz = getattr(dtype, 'tz', None)
@@ -322,9 +324,20 @@ def __init__(self, values, dtype=_NS_DTYPE, freq=None, copy=False):
322324
self._dtype = dtype
323325
self._freq = freq
324326

327+
if inferred_freq is None and freq is not None:
328+
type(self)._validate_frequency(self, freq)
329+
325330
@classmethod
326-
def _simple_new(cls, values, freq=None, dtype=None):
327-
return cls(values, freq=freq, dtype=dtype)
331+
def _simple_new(cls, values, freq=None, dtype=_NS_DTYPE):
332+
assert isinstance(values, np.ndarray)
333+
if values.dtype == 'i8':
334+
values = values.view(_NS_DTYPE)
335+
336+
result = object.__new__(cls)
337+
result._data = values
338+
result._freq = freq
339+
result._dtype = dtype
340+
return result
328341

329342
@classmethod
330343
def _from_sequence(cls, data, dtype=None, copy=False,

pandas/core/internals/blocks.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3084,7 +3084,7 @@ def make_block(values, placement, klass=None, ndim=None, dtype=None,
30843084
elif klass is DatetimeTZBlock and not is_datetime64tz_dtype(values):
30853085
# TODO: This is no longer hit internally; does it need to be retained
30863086
# for e.g. pyarrow?
3087-
values = DatetimeArray(values, dtype)
3087+
values = DatetimeArray._simple_new(values, dtype=dtype)
30883088

30893089
return klass(values, ndim=ndim, placement=placement)
30903090

pandas/tests/arrays/test_datetimes.py

+10
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,16 @@
1616

1717

1818
class TestDatetimeArrayConstructor(object):
19+
def test_freq_validation(self):
20+
# GH#24623 check that invalid instances cannot be created with the
21+
# public constructor
22+
arr = np.arange(5, dtype=np.int64) * 3600 * 10**9
23+
24+
msg = ("Inferred frequency H from passed values does not "
25+
"conform to passed frequency W-SUN")
26+
with pytest.raises(ValueError, match=msg):
27+
DatetimeArray(arr, freq="W")
28+
1929
@pytest.mark.parametrize('meth', [DatetimeArray._from_sequence,
2030
sequence_to_dt64ns,
2131
pd.to_datetime,

0 commit comments

Comments
 (0)