假设我有一列国家首字母缩写,将一列UTC时间转换为本地化时间的最佳方法是什么?
例如
UTC Country
---------- | --------
1480597215 FR
1480544735 RU
自
UTC Country Localized time (example)
---------- | -------- ---------------
1480597215 FR datetime.datetime(2016, 12, 2, 0, 0, 15, tzinfo = FR)
1480544735 RU
我知道存在时区问题(例如,美国的不同地区位于不同的时区),但假设有一个近似的映射(例如,美国所有地区都遵循中部时间)
最好的方法是什么? pytz 图书馆需要实际时区(例如,"亚洲/马来西亚"),但我只有国家代码。
谢谢!:)
您可以使用矢量化to_datetime
+tz_localize
来表示UTC
日期时间,然后使用矢量化apply
转换为时区:
from pytz import country_timezones
df['date'] = pd.to_datetime(df['UTC'], unit='s').dt.tz_localize('UTC')
df['tz']=df.apply(lambda x: x['date'].tz_convert(country_timezones(x['Country'])[0]), axis=1)
print (df)
UTC Country date tz
0 1480597215 FR 2016-12-01 13:00:15+00:00 2016-12-01 14:00:15+01:00
1 1480544735 RU 2016-11-30 22:25:35+00:00 2016-12-01 00:25:35+02:00
使用notnull
创建掩码,然后仅对True
s 的值应用解决方案:
df = pd.DataFrame({'UTC': [1480597215, 1480597215, 1480597215, 1480544735],
'Country': ['', np.nan, 'FR', 'RU']})
print (df)
Country UTC
0 1480597215
1 NaN 1480597215
2 FR 1480597215
3 RU 1480544735
df['UTC'] = pd.to_datetime(df['UTC'], unit='s', errors='coerce').dt.tz_localize('UTC')
mask = df['Country'].notnull() & (df['Country'] != '')
print (mask)
0 False
1 False
2 True
3 True
Name: Country, dtype: bool
df['tz'] = df[mask].apply(lambda x: x['UTC'].tz_convert(country_timezones(x['Country'])[0]),
axis=1)
print (df)
Country UTC tz
0 2016-12-01 13:00:15+00:00 NaN
1 NaN 2016-12-01 13:00:15+00:00 NaN
2 FR 2016-12-01 13:00:15+00:00 2016-12-01 14:00:15+01:00
3 RU 2016-11-30 22:25:35+00:00 2016-12-01 00:25:35+02:00
您可以使用 pytz 的country_timezones:
import pytz
from datetime import datetime
timestamp = 1480597215
d = datetime.fromtimestamp(timestamp, pytz.timezone(pytz.country_timezones('fr')[0]))
print d
请记住,pytz.country_timezones返回与输入相关的可用时区列表。