将 UTC 日期时间转换为 pandas 中的本地日期时间

Posted

技术标签:

【中文标题】将 UTC 日期时间转换为 pandas 中的本地日期时间【英文标题】:Convert the UTC datetime to local datetime in pandas 【发布时间】:2018-07-15 18:11:56 【问题描述】:

我有一个包含 UTC_Time 和 Timezone_info 的数据框。我需要将 UTC_Time 转换为 local_time。我有以下代码,但它不工作。有没有办法有效地做到这一点(我可以使用 for 循环并且它可以工作,但我想尽可能避免 for 循环)。

        UTC_Time         Timezone_info
0  2018-02-12 18:16:00       America/New_York
1  2018-02-15 11:39:00    America/Puerto_Rico
2  2018-02-15 22:17:00    America/Los_Angeles
3  2018-02-17 00:59:00      America/Guayaquil
4  2018-02-17 11:34:00  America/Santo_Domingo

我尝试使用的代码是: data['local_time']=data['UTC_Time'].dt.tz_localize('UTC').dt.tz_convert(data['Timezone_info'])

但这不起作用。

使其工作的 for 循环(但可能是最慢的方法):

data['local_time']=0
for i in range(len(data)):
    tz=data.at[i,'Timezone_info']
    data.at[i,'local_time']=data.at[i,'UTC_Time'].tz_localize(data).tz_convert(tz)

pythonic 的方法是什么?

【问题讨论】:

【参考方案1】:

由于tz_convert 仅将一个时区作为参数,因此它的参数没有“矢量化”。

您仍然可以在矢量化形式中使用tz_convert,但首先您必须使用group_by 根据时区拆分输入。

data['local_time'] = (
    data['UTC_Time'].dt.tz_localize('UTC').       # Localize to UTC Time
    groupby(data['Timezone_info']).               # Group by time zone
    transform(lambda g: g.dt.tz_convert(g.name))) # Convert each group to local time zone

我做了一些实验,发现groupby 键在组对象的name 成员中可用。那应该添加到GroupBy.transform的文档中。

【讨论】:

【参考方案2】:

使用df.apply 可能有效。这不是矢量化的,但确实避免了显式的 for 循环。

def converter(row):
    return row['UTC_Time'].tz_localize('UTC').tz_convert(row['Timezone_info'])

df['local_time'] = df.apply(converter, axis=1)

【讨论】:

以上是关于将 UTC 日期时间转换为 pandas 中的本地日期时间的主要内容,如果未能解决你的问题,请参考以下文章

将 UTC 日期时间全局转换为用户指定的本地日期时间

Pandas 使用单独的时区列转换日期时间

iOS将NSDate的UTC日期转换为本地时间以获取本地通知

Sequelize将日期从UTC转换为本地

使用时刻将对象中的本地时间转换为UTC

将 UTC 日期时间字符串转换为本地日期时间