首页 > 解决方案 > 将“自 1582 年 10 月 14 日以来的秒数”转换为 Python 日期时间

问题描述

我正在尝试将 SPSS 时间戳转换为人类可读的时间戳,例如

 data['Completion_date'] = pd.to_datetime(
     data['Completion_date']/86400, unit='D',
     origin=pd.Timestamp("1582-10-14"))

但得到

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "pandas/_libs/tslibs/timestamps.pyx", line 644, in pandas._libs.tslibs.timestamps.Timestamp.__new__
  File "pandas/_libs/tslibs/conversion.pyx", line 275, in pandas._libs.tslibs.conversion.convert_to_tsobject
  File "pandas/_libs/tslibs/conversion.pyx", line 470, in pandas._libs.tslibs.conversion.convert_str_to_tsobject
  File "pandas/_libs/tslibs/conversion.pyx", line 439, in pandas._libs.tslibs.conversion.convert_str_to_tsobject
  File "pandas/_libs/tslibs/np_datetime.pyx", line 121, in pandas._libs.tslibs.np_datetime.check_dts_bounds
pandas._libs.tslibs.np_datetime.OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 1582-10-14 00:00:00

示例:13725072000 应转换为 2017-09-18

SPSS 中的日期以自 1582 年 10 月 14 日(儒略历的开始日期)以来的秒数记录。

我该怎么做?

标签: pythonpandasdataframe

解决方案


文档

由于 pandas 以纳秒分辨率表示时间戳,因此可以使用 64 位整数表示的时间跨度被限制为大约 584 年:

In [68]: pd.Timestamp.min 
Out[68]: Timestamp('1677-09-21 00:12:43.145225')

In [69]: pd.Timestamp.max 
Out[69]: Timestamp('2262-04-11 23:47:16.854775807')

您的日期早于可能的最早时间戳。

您可能想要解决此问题的一种方法是将日期调整为基于to_datetime默认的 unix 时间,该时间从儒略历开始后 141,428 天开始(感谢 Google!)。然后你可以这样做:

data['Completion_date'] = pd.to_datetime((data['Completion_date']/86400)-141428, unit='D')

推荐阅读