我有一个数据框z2,其列为utc_time和timezone。我想创建一个新列,该列采用UTC纪元时间,并根据列timezone中的时区返回日期时间。我也正在使用pytz的功能timezone。我想在合理的运行时间下将以下函数应用于整个数据帧(几百万个长)。我尝试使用assign and apply,但是它给了我一个“ Series”对象,没有属性“ upper”错误
datetime.fromtimestamp((z2['utc_time'][0])/1000, timezone(str(z2['timezone'][0]))).strftime('%Y-%m-%d %H:%M:%S')
答案 0 :(得分:0)
由于只有4个时区,因此可以循环这些时区。您可以使用.loc
选择相应的行并进行本地化。例如:
import pandas as pd
# example df:
df = pd.DataFrame({'UTCtime': ['2020-03-01T12:00:00', '2020-07-01T12:00:00'],
'Timezone': ['US/Pacific', 'US/Eastern']})
# parse strings to UTC first:
df['UTCtime'] = pd.to_datetime(df['UTCtime'], utc=True)
# create a dummy column to avoid key error:
df['LOCtime'] = False
# loop unique time zones and fill local time column:
for tz in df['Timezone'].unique():
df['LOCtime'].loc[df['Timezone']==tz] = df['UTCtime'].loc[df['Timezone']==tz].dt.tz_convert(tz)
例如,给您
df
UTCtime Timezone LOCtime
0 2020-03-01 12:00:00+00:00 US/Pacific 2020-03-01 04:00:00-08:00
1 2020-07-01 12:00:00+00:00 US/Eastern 2020-07-01 08:00:00-04:00
另一个选择可能是将.apply
与lambda
一起使用。做一个不错的1-liner,但我估计这还不算有效:
df['LOCtime'] = df.apply(lambda r: r['UTCtime'].tz_convert(r['Timezone']), axis=1)