Skip to content

Commit baeacad

Browse files
authored
ENH: support 2D in DatetimeArray._from_sequence (#38021)
1 parent bffc7ad commit baeacad

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

pandas/core/arrays/datetimes.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -2071,20 +2071,24 @@ def objects_to_datetime64ns(
20712071
# if str-dtype, convert
20722072
data = np.array(data, copy=False, dtype=np.object_)
20732073

2074+
flags = data.flags
2075+
order = "F" if flags.f_contiguous else "C"
20742076
try:
20752077
result, tz_parsed = tslib.array_to_datetime(
2076-
data,
2078+
data.ravel("K"),
20772079
errors=errors,
20782080
utc=utc,
20792081
dayfirst=dayfirst,
20802082
yearfirst=yearfirst,
20812083
require_iso8601=require_iso8601,
20822084
)
2085+
result = result.reshape(data.shape, order=order)
20832086
except ValueError as e:
20842087
try:
2085-
values, tz_parsed = conversion.datetime_to_datetime64(data)
2088+
values, tz_parsed = conversion.datetime_to_datetime64(data.ravel("K"))
20862089
# If tzaware, these values represent unix timestamps, so we
20872090
# return them as i8 to distinguish from wall times
2091+
values = values.reshape(data.shape, order=order)
20882092
return values.view("i8"), tz_parsed
20892093
except (ValueError, TypeError):
20902094
raise e

pandas/tests/arrays/test_datetimes.py

+18
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,24 @@ def test_tz_dtype_matches(self):
465465
result, _, _ = sequence_to_dt64ns(arr, dtype=DatetimeTZDtype(tz="US/Central"))
466466
tm.assert_numpy_array_equal(arr._data, result)
467467

468+
@pytest.mark.parametrize("order", ["F", "C"])
469+
def test_2d(self, order):
470+
dti = pd.date_range("2016-01-01", periods=6, tz="US/Pacific")
471+
arr = np.array(dti, dtype=object).reshape(3, 2)
472+
if order == "F":
473+
arr = arr.T
474+
475+
res = sequence_to_dt64ns(arr)
476+
expected = sequence_to_dt64ns(arr.ravel())
477+
478+
tm.assert_numpy_array_equal(res[0].ravel(), expected[0])
479+
assert res[1] == expected[1]
480+
assert res[2] == expected[2]
481+
482+
res = DatetimeArray._from_sequence(arr)
483+
expected = DatetimeArray._from_sequence(arr.ravel()).reshape(arr.shape)
484+
tm.assert_datetime_array_equal(res, expected)
485+
468486

469487
class TestReductions:
470488
@pytest.fixture

0 commit comments

Comments
 (0)