首页 > 解决方案 > 从正确的 UTC 时间创建新的本地时间列

问题描述

from datetime import datetime
import pandas as pd
import pytz

times = pd.DataFrame(
    {'Time':['2020-03-14 12:00:00']*5,
     'TimeZone':['US/Pacific','US/Arizona','US/Mountain',
                 'US/Central','US/Eastern']})
times.Time = times.Time.map(
    lambda x: datetime.fromisoformat(x).astimezone(pytz.utc))
times.TimeZone = times.TimeZone.map(pytz.timezone)

我想用这个脚本做两件事。

  1. 在进行任何进一步操作之前,我希望times.Time都在 UTC 中午 12:00,而不是根据我的本地时区向前/向后映射。理想情况下,我希望这个脚本在世界任何地方都可以运行,而不必手动考虑机器的本地时区。
  2. 我想创建与时区datetime相同times.Time但在times.TimeZone时区中的第三列对象。

我怎样才能做到这一点?

标签: pythonpandasdatetime

解决方案


对于 #1,您应该使用pd.to_datetime后跟tz_localize. 对于#2,它是tz_convert

times['Time'] = pd.to_datetime(times['Time']).dt.tz_localize('utc')
times['TimeZone'] = times['TimeZone'].map(pytz.timezone)

# This operation is not vectorized (read: slow)
times['LocalTime'] = times.apply(lambda row: row['Time'].tz_convert(row['TimeZone']), axis=1)

结果:

                       Time     TimeZone                  LocalTime
0 2020-03-14 12:00:00+00:00   US/Pacific  2020-03-14 05:00:00-07:00
1 2020-03-14 12:00:00+00:00   US/Arizona  2020-03-14 05:00:00-07:00
2 2020-03-14 12:00:00+00:00  US/Mountain  2020-03-14 06:00:00-06:00
3 2020-03-14 12:00:00+00:00   US/Central  2020-03-14 07:00:00-05:00
4 2020-03-14 12:00:00+00:00   US/Eastern  2020-03-14 08:00:00-04:00

推荐阅读