如何通过 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
(即使用有意识的时间戳)让它工作得很好。
我发现 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
(即使用有意识的时间戳)让它工作得很好。