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)
我想用这个脚本做两件事。
times.Time
都是UTC的中午12:00,而不是根据我的本地时区向前/向后映射。理想情况下,我希望此脚本在世界上任何地方都可以运行,而不必手动考虑计算机的本地时区。datetime
相同时间但在times.Time
时区中的times.TimeZone
对象的第三列。我该怎么做?
对于#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
您无需本地化为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