Skip to content

Commit 5cbfa66

Browse files
authored
Backport PR #39442 BUG: DataFrame constructor reordering elements with ndarray from datetime dtype not datetime64[ns (#39475)
(cherry picked from commit 624621b)
1 parent a61ab39 commit 5cbfa66

File tree

3 files changed

+66
-1
lines changed

3 files changed

+66
-1
lines changed

doc/source/whatsnew/v1.2.2.rst

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ including other versions of pandas.
1414

1515
Fixed regressions
1616
~~~~~~~~~~~~~~~~~
17+
- Fixed regression in :class:`DataFrame` constructor reordering element when construction from datetime ndarray with dtype not ``"datetime64[ns]"`` (:issue:`39422`)
1718
- Fixed regression in :meth:`~DataFrame.to_pickle` failing to create bz2/xz compressed pickle files with ``protocol=5`` (:issue:`39002`)
1819
- Fixed regression in :func:`pandas.testing.assert_series_equal` and :func:`pandas.testing.assert_frame_equal` always raising ``AssertionError`` when comparing extension dtypes (:issue:`39410`)
1920
- Fixed regression in :meth:`~DataFrame.to_csv` opening ``codecs.StreamWriter`` in binary mode instead of in text mode and ignoring user-provided ``mode`` (:issue:`39247`)

pandas/_libs/tslibs/conversion.pyx

+1-1
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ def ensure_datetime64ns(arr: ndarray, copy: bool=True):
224224

225225
ivalues = arr.view(np.int64).ravel("K")
226226

227-
result = np.empty(shape, dtype=DT64NS_DTYPE)
227+
result = np.empty_like(arr, dtype=DT64NS_DTYPE)
228228
iresult = result.ravel("K").view(np.int64)
229229

230230
if len(iresult) == 0:

pandas/tests/frame/test_constructors.py

+64
Original file line numberDiff line numberDiff line change
@@ -1936,6 +1936,70 @@ def test_constructor_datetimes_with_nulls(self, arr):
19361936
expected = Series([np.dtype("datetime64[ns]")])
19371937
tm.assert_series_equal(result, expected)
19381938

1939+
@pytest.mark.parametrize("order", ["K", "A", "C", "F"])
1940+
@pytest.mark.parametrize(
1941+
"dtype",
1942+
[
1943+
"datetime64[M]",
1944+
"datetime64[D]",
1945+
"datetime64[h]",
1946+
"datetime64[m]",
1947+
"datetime64[s]",
1948+
"datetime64[ms]",
1949+
"datetime64[us]",
1950+
"datetime64[ns]",
1951+
],
1952+
)
1953+
def test_constructor_datetimes_non_ns(self, order, dtype):
1954+
na = np.array(
1955+
[
1956+
["2015-01-01", "2015-01-02", "2015-01-03"],
1957+
["2017-01-01", "2017-01-02", "2017-02-03"],
1958+
],
1959+
dtype=dtype,
1960+
order=order,
1961+
)
1962+
df = DataFrame(na)
1963+
expected = DataFrame(
1964+
[
1965+
["2015-01-01", "2015-01-02", "2015-01-03"],
1966+
["2017-01-01", "2017-01-02", "2017-02-03"],
1967+
]
1968+
)
1969+
expected = expected.astype(dtype=dtype)
1970+
tm.assert_frame_equal(df, expected)
1971+
1972+
@pytest.mark.parametrize("order", ["K", "A", "C", "F"])
1973+
@pytest.mark.parametrize(
1974+
"dtype",
1975+
[
1976+
"timedelta64[D]",
1977+
"timedelta64[h]",
1978+
"timedelta64[m]",
1979+
"timedelta64[s]",
1980+
"timedelta64[ms]",
1981+
"timedelta64[us]",
1982+
"timedelta64[ns]",
1983+
],
1984+
)
1985+
def test_constructor_timedelta_non_ns(self, order, dtype):
1986+
na = np.array(
1987+
[
1988+
[np.timedelta64(1, "D"), np.timedelta64(2, "D")],
1989+
[np.timedelta64(4, "D"), np.timedelta64(5, "D")],
1990+
],
1991+
dtype=dtype,
1992+
order=order,
1993+
)
1994+
df = DataFrame(na).astype("timedelta64[ns]")
1995+
expected = DataFrame(
1996+
[
1997+
[Timedelta(1, "D"), Timedelta(2, "D")],
1998+
[Timedelta(4, "D"), Timedelta(5, "D")],
1999+
],
2000+
)
2001+
tm.assert_frame_equal(df, expected)
2002+
19392003
def test_constructor_for_list_with_dtypes(self):
19402004
# test list of lists/ndarrays
19412005
df = DataFrame([np.arange(5) for x in range(5)])

0 commit comments

Comments
 (0)