日期时间和熊猫之间的 Unix 纪元值不匹配

Posted

技术标签:

【中文标题】日期时间和熊猫之间的 Unix 纪元值不匹配【英文标题】:Unix Epoche value mismatch between datetime and pandas 【发布时间】:2020-07-01 03:52:37 【问题描述】:

我在 pandas 数据框中存储没有时区信息的日期时间对象。 获取时间戳信息时,与从原始日期时间对象获取的时间戳不同。

import pandas as pd
from datetime import datetime

dt = datetime.now()
print(dt)
print(dt.timestamp())

df = pd.DataFrame(data=[(dt)],columns=["date"])
print(df)

epoche_from_pandas = df.date.apply(lambda x: x.timestamp()).values[0]
print(epoche_from_pandas)

打印 pandas 数据框会显示相同的日期时间字符串,但纪元值不同。两个时间戳都移动了 3600 秒,这相当于我的本地时区差异(+1 小时)。

2020-03-20 01:05:05.457290

1584662705.45729

2020-03-20 01:05:05.457290

1584666305.45729

我的假设是 pandas 使用它自己的内部表示,它忽略了纪元值(可能使用年、月、日、小时......组件创建)并以 unix 时间打印(未本地化)。这意味着虽然两个打印语句产生相同的字符串,但 pandas 时间实际上提前了 1 小时,因为它反映了通常滞后 1 小时的 unix。

上面说的对吗?

【问题讨论】:

你能提供一个minimal reproducible example吗?顺便说一句,为什么.values[0] 当然,我添加了导入。我使用 .values[0] 从数据框中提取原始值(它只包含一个值,因此是第 0 个索引。 从(我相信)Pandas 1.0 开始,从 Series 或 DataFrame 获取 NumPy 数组的推荐方法是使用.to_numpy(),而不是.values。无论如何,这里你甚至不需要.values,你可以直接索引Series。 【参考方案1】:

从技术上讲,这还不是解决问题的方法,但我发现了一段更清晰的代码,似乎可以复制该问题:

from datetime import datetime

import pandas as pd

dt = datetime.now()
print(f"dt: dt")
print(f"dt timestamp: dt.timestamp()\n")

pd_ts = pd.Timestamp(dt)
print(f"pd Ts: pd_ts")
print(f"pd Ts .timestamp(): pd_ts.timestamp()")

print(dt.timestamp() - pd_ts.timestamp())

输出:

dt: 2020-03-19 21:06:12.627798
dt timestamp: 1584666372.627798

pd Ts: 2020-03-19 21:06:12.627798
pd Ts .timestamp(): 1584651972.627798
14400.0

【讨论】:

【参考方案2】:

使用to_pydatetime() 将数据转换为python 日期时间对象,然后timestamp() 返回相同的值。

import pandas as pd
from datetime import datetime

dt = datetime.now()
print(dt)
print(dt.timestamp())

df = pd.DataFrame(data=[(dt)],columns=["date"])
print(df)

epoche_from_pandas = df.date.apply(lambda x: x.to_pydatetime().timestamp()).values[0]
print(epoche_from_pandas)

结果:

2020-03-19 21:20:56.633482
1584667256.633482
                        date
0 2020-03-19 21:20:56.633482
1584667256.633482

【讨论】:

谢谢,这真的很有帮助。您是否还详细说明了导致差异的原因?我做的假设对吗?

以上是关于日期时间和熊猫之间的 Unix 纪元值不匹配的主要内容,如果未能解决你的问题,请参考以下文章

python iso8601日期格式与unix纪元日期时间之间的转换

日期时间字符串到纪元:熊猫数据框

将纪元时间转换为熊猫数据框中的格式化日期字符串

将 UNIX 纪元转换为日期对象

在perl中将日期转换为纪元的最佳方法[关闭]

将日期、时间和 UTC 偏移值转换为自 unix 纪元以来的毫秒数?