Skip to content

Commit 624621b

Browse files
authored
BUG: DataFrame constructor reordering elements with ndarray from datetime dtype not datetime64[ns] (pandas-dev#39442)
1 parent 5dfca7a commit 624621b

File tree

3 files changed

+66
-1
lines changed

3 files changed

+66
-1
lines changed

doc/source/whatsnew/v1.3.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ Datetimelike
274274
- Bug in constructing a :class:`DataFrame` or :class:`Series` with mismatched ``datetime64`` data and ``timedelta64`` dtype, or vice-versa, failing to raise ``TypeError`` (:issue:`38575`, :issue:`38764`, :issue:`38792`)
275275
- Bug in constructing a :class:`Series` or :class:`DataFrame` with a ``datetime`` object out of bounds for ``datetime64[ns]`` dtype or a ``timedelta`` object out of bounds for ``timedelta64[ns]`` dtype (:issue:`38792`, :issue:`38965`)
276276
- Bug in :meth:`DatetimeIndex.intersection`, :meth:`DatetimeIndex.symmetric_difference`, :meth:`PeriodIndex.intersection`, :meth:`PeriodIndex.symmetric_difference` always returning object-dtype when operating with :class:`CategoricalIndex` (:issue:`38741`)
277+
- Bug in :class:`DataFrame` constructor reordering element when construction from datetime ndarray with dtype not ``"datetime64[ns]"`` (:issue:`39422`)
277278
- Bug in :meth:`Series.where` incorrectly casting ``datetime64`` values to ``int64`` (:issue:`37682`)
278279
- Bug in :class:`Categorical` incorrectly typecasting ``datetime`` object to ``Timestamp`` (:issue:`38878`)
279280
- Bug in comparisons between :class:`Timestamp` object and ``datetime64`` objects just outside the implementation bounds for nanosecond ``datetime64`` (:issue:`39221`)

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
@@ -1762,6 +1762,70 @@ def test_constructor_datetimes_with_nulls(self, arr):
17621762
expected = Series([np.dtype("datetime64[ns]")])
17631763
tm.assert_series_equal(result, expected)
17641764

1765+
@pytest.mark.parametrize("order", ["K", "A", "C", "F"])
1766+
@pytest.mark.parametrize(
1767+
"dtype",
1768+
[
1769+
"datetime64[M]",
1770+
"datetime64[D]",
1771+
"datetime64[h]",
1772+
"datetime64[m]",
1773+
"datetime64[s]",
1774+
"datetime64[ms]",
1775+
"datetime64[us]",
1776+
"datetime64[ns]",
1777+
],
1778+
)
1779+
def test_constructor_datetimes_non_ns(self, order, dtype):
1780+
na = np.array(
1781+
[
1782+
["2015-01-01", "2015-01-02", "2015-01-03"],
1783+
["2017-01-01", "2017-01-02", "2017-02-03"],
1784+
],
1785+
dtype=dtype,
1786+
order=order,
1787+
)
1788+
df = DataFrame(na)
1789+
expected = DataFrame(
1790+
[
1791+
["2015-01-01", "2015-01-02", "2015-01-03"],
1792+
["2017-01-01", "2017-01-02", "2017-02-03"],
1793+
]
1794+
)
1795+
expected = expected.astype(dtype=dtype)
1796+
tm.assert_frame_equal(df, expected)
1797+
1798+
@pytest.mark.parametrize("order", ["K", "A", "C", "F"])
1799+
@pytest.mark.parametrize(
1800+
"dtype",
1801+
[
1802+
"timedelta64[D]",
1803+
"timedelta64[h]",
1804+
"timedelta64[m]",
1805+
"timedelta64[s]",
1806+
"timedelta64[ms]",
1807+
"timedelta64[us]",
1808+
"timedelta64[ns]",
1809+
],
1810+
)
1811+
def test_constructor_timedelta_non_ns(self, order, dtype):
1812+
na = np.array(
1813+
[
1814+
[np.timedelta64(1, "D"), np.timedelta64(2, "D")],
1815+
[np.timedelta64(4, "D"), np.timedelta64(5, "D")],
1816+
],
1817+
dtype=dtype,
1818+
order=order,
1819+
)
1820+
df = DataFrame(na).astype("timedelta64[ns]")
1821+
expected = DataFrame(
1822+
[
1823+
[Timedelta(1, "D"), Timedelta(2, "D")],
1824+
[Timedelta(4, "D"), Timedelta(5, "D")],
1825+
],
1826+
)
1827+
tm.assert_frame_equal(df, expected)
1828+
17651829
def test_constructor_for_list_with_dtypes(self):
17661830
# test list of lists/ndarrays
17671831
df = DataFrame([np.arange(5) for x in range(5)])

0 commit comments

Comments
 (0)