【发布时间】:2021-02-22 13:36:41
【问题描述】:
我有一个带有 UNIX 时间戳的 pandas 数据框(这些是整数,而不是时间对象)。观测发生在多个地理位置,因此发生在多个时区。 我想根据观测的地理位置将 UNIX 时间戳转换为每个时区的本地时间(在新列中)(此信息位于数据框的列中)。
简单的工作示例:
创建数据框:
c1=[1546555701, 1546378818, 1546574677, 1546399159, 1546572278]
c2=['America/Detroit','America/Chicago','America/Los_Angeles','America/Los_Angeles','America/Detroit']
df3=pd.DataFrame(list(zip(c1,c2)),columns=['utc','tz'])
print(df3)
预期输出:
utc tz
0 1546555701 America/Detroit
1 1546378818 America/Chicago
2 1546574677 America/Los_Angeles
3 1546399159 America/Los_Angeles
4 1546572278 America/Detroit
当前尝试:
df3['date_time']=pd.to_datetime(df3['utc'],unit='s')
print(df3)
返回:
utc tz date_time
0 1546555701 America/Detroit 2019-01-03 22:48:21
1 1546378818 America/Chicago 2019-01-01 21:40:18
2 1546574677 America/Los_Angeles 2019-01-04 04:04:37
3 1546399159 America/Los_Angeles 2019-01-02 03:19:19
4 1546572278 America/Detroit 2019-01-04 03:24:38
这将转换为一个日期时间对象,但我不确定如何控制时区(我认为它给了我本地时区的时间)。它当然不是基于“tz”列。
我查看了 pandas 的 tz_convert() 函数和 arrow package,但无法弄清楚如何使这些工作。我也对其他解决方案持开放态度。 我不仅关心时区,还确保正确处理夏令时。
【问题讨论】:
-
这些不是 UTC 时间戳。它们可能是 Unix 时间戳。这不是吹毛求疵。在 Unix 系统之外编程时间戳通常意味着完整的 ISO8601 时间戳。在数据库中,
timestamp类型或其等价物是日期+时间值 -
@PanagiotisKanavos 你是对的,我已经相应地改变了问题。
-
如果您只需要使用这些时间戳工作,我建议将其保留为 UTC 并保留时区信息。如果您需要它用于演示或其他东西(需要它是人类可读的),我只会转换为特定的 tz。
-
@MrFuppes 我需要能够将底特律早上 5:00 的观察结果与波士顿早上 5:00 的观察结果进行比较。这似乎需要这种转换,不是吗?我(可能很明显)是使用时间戳的新手,所以我愿意接受建议和改进的工作流程。
-
我做了另一个编辑;混合时区很好,但您不能使用
dt访问器,因此提取单个时间戳属性有点困难。
标签: python pandas datetime timezone dst