根据正确的UTC时间创建本地时间的新列

问题描述 投票:1回答:2
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对象的第三列。

我该怎么做?

python pandas datetime
2个回答
1
投票

对于#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

0
投票

您无需本地化为UTC,只需在将字符串转换为日期时间时设置关键字utc=True。也不需要pytz。例如:

import pandas as pd

times = pd.DataFrame({'Time':['2020-03-14 12:00:00']*5,
                      'TimeZone':['US/Pacific','US/Arizona','US/Mountain',
                                  'US/Central','US/Eastern']})

times['Time'] = pd.to_datetime(times['Time'], utc=True)
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
© www.soinside.com 2019 - 2024. All rights reserved.