Skip to content

Commit 52a45be

Browse files
committed
Fix wrong save of datetime64[s] in HDFStore
1 parent b0c4194 commit 52a45be

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

pandas/io/pytables.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -3036,7 +3036,10 @@ def read_array(self, key: str, start: int | None = None, stop: int | None = None
30363036
if dtype and dtype.startswith("datetime64"):
30373037
# reconstruct a timezone if indicated
30383038
tz = getattr(attrs, "tz", None)
3039-
ret = _set_tz(ret, tz)
3039+
if dtype == "datetime64[s]":
3040+
ret = _set_tz(ret, tz, unit="s")
3041+
else:
3042+
ret = _set_tz(ret, tz) # default unit is ns
30403043

30413044
elif dtype == "timedelta64":
30423045
ret = np.asarray(ret, dtype="m8[ns]")
@@ -4964,19 +4967,22 @@ def _get_tz(tz: tzinfo) -> str | tzinfo:
49644967
return zone
49654968

49664969

4967-
def _set_tz(values: npt.NDArray[np.int64], tz: str | tzinfo | None) -> DatetimeArray:
4970+
def _set_tz(
4971+
values: npt.NDArray[np.int64], tz: str | tzinfo | None, unit: str = "ns"
4972+
) -> DatetimeArray:
49684973
"""
49694974
Coerce the values to a DatetimeArray with appropriate tz.
49704975
49714976
Parameters
49724977
----------
49734978
values : ndarray[int64]
49744979
tz : str, tzinfo, or None
4980+
unit : str. The default unit is ns. Needs to be specified otherwise.
49754981
"""
49764982
assert values.dtype == "i8", values.dtype
49774983
# Argument "tz" to "tz_to_dtype" has incompatible type "str | tzinfo | None";
49784984
# expected "tzinfo"
4979-
dtype = tz_to_dtype(tz=tz, unit="ns") # type: ignore[arg-type]
4985+
dtype = tz_to_dtype(tz=tz, unit=unit) # type: ignore[arg-type]
49804986
dta = DatetimeArray._from_sequence(values, dtype=dtype)
49814987
return dta
49824988

pandas/tests/io/pytables/test_read.py

+11
Original file line numberDiff line numberDiff line change
@@ -317,3 +317,14 @@ def test_read_infer_string(tmp_path, setup_path):
317317
columns=Index(["a"], dtype="string[pyarrow_numpy]"),
318318
)
319319
tm.assert_frame_equal(result, expected)
320+
321+
322+
def test_hdfstore_read_datetime64_unit_s():
323+
# Fix issue 59004: HDFStore doesn't save datetime64[s] right
324+
df_s = DataFrame(["2001-01-01", "2002-02-02"], dtype="datetime64[s]")
325+
with HDFStore("deleteme.h5", mode="w") as store:
326+
store.put("df_s", df_s)
327+
with HDFStore("deleteme.h5", mode="r") as store:
328+
df_fromstore = store.get("df_s")
329+
tm.assert_frame_equal(df_s, df_fromstore)
330+
Path("deleteme.h5").unlink() # Delete created file

0 commit comments

Comments
 (0)