[英]Pandas convert UNIX time to multiple different timezones depending on column value
我有一个带有 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”列。
我看过熊猫的tz_convert()函数和箭头包,但一直无法弄清楚如何使这些工作。 我也愿意接受其他解决方案。 我不仅关心时区,还要确保正确处理夏令时。
假设 POSIX 时间戳(自 1970-01-01 UTC 以来的秒数),您可以使用关键字 utc=True 直接转换为 UTC。
import pandas as pd
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'])
df3['date_time']=pd.to_datetime(df3['utc'], unit='s', utc=True)
# df3['date_time']
# 0 2019-01-03 22:48:21+00:00
# 1 2019-01-01 21:40:18+00:00
# 2 2019-01-04 04:04:37+00:00
# 3 2019-01-02 03:19:19+00:00
# 4 2019-01-04 03:24:38+00:00
# Name: date_time, dtype: datetime64[ns, UTC]
然后,您可以使用 apply 将时区应用于每个值,例如
def setTZ(row):
return row['date_time'].tz_convert(row['tz'])
df3['date_time']=df3.apply(lambda r: setTZ(r), axis=1)
# df3
# utc tz date_time
# 0 1546555701 America/Detroit 2019-01-03 17:48:21-05:00
# 1 1546378818 America/Chicago 2019-01-01 15:40:18-06:00
# 2 1546574677 America/Los_Angeles 2019-01-03 20:04:37-08:00
# 3 1546399159 America/Los_Angeles 2019-01-01 19:19:19-08:00
# 4 1546572278 America/Detroit 2019-01-03 22:24:38-05:00
请注意,对于混合时区,您不能对系列使用dt
访问器。 您需要迭代代码,例如
df3['date_time'].apply(lambda t: t.hour)
获取每个日期时间的小时数。 解决此问题的一种方法是创建一个具有本地时间但不知道时区的列:
def toLocalTime(row):
return row['date_time'].tz_convert(row['tz']).replace(tzinfo=None)
df3['local_time'] = df3.apply(lambda r: toLocalTime(r), axis=1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.