如何通过 pandas 将 UNIX 时间戳正确转换为 pd.Timestamp 对象?

How to properly convert a UNIX timestamp to pd.Timestamp object via pandas?

我发现 pandas 将 UNIX 时间戳转换为 python 日期时间对象的方式不一致:

d = datetime.datetime.utcnow()

timestamp = d.timestamp()

assert datetime.datetime.fromtimestamp(timestamp) == d

assert pd.to_datetime(timestamp, unit="s").to_pydatetime() == d

第一个断言是正确的,而第二个断言是错误的。 Pandas 正在将 UTC 时间戳转换为我的本地时区。

很难相信这是一个错误,所以我做错了什么?

谢谢!

问题很简单但不明显。 utcnow() 给你一个天真的日期时间对象,这意味着 它不知道它代表 UTC 的事实。 因此,一旦你调用 .timestamp(),Python 假定 当地时间 因为 datetime 对象是天真的!因此在计算 Unix 时间之前首先转换为 UTC,添加您本地 tz 可能具有的任何 UTC 偏移量。

解决方案: 构造一个可识别 UTC 的日期时间对象。 fromtimestamp 也是如此:将 UTC 设置为 tz !

from datetime import datetime, timezone
import pandas as pd

d = datetime.now(timezone.utc)
timestamp = d.timestamp()

assert datetime.fromtimestamp(timestamp, tz=timezone.utc) == d
assert pd.to_datetime(timestamp, unit="s", utc=True).to_pydatetime() == d

pandas 有点不同;天真的日期时间在内部被视为 UTC,因此 pd.to_datetime(timestamp, unit="s") 为您提供 UTC 时间戳。但是转换为 Python datetime 并没有考虑到 Python 会再次将其视为本地时间......在这里,保持一致并设置 utc=True (即使用有意识的时间戳)让它工作得很好。