繁体   English   中英

Pandas 根据列值将 UNIX 时间转换为多个不同的时区

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM