多列时区上的熊猫日期时间函数

时间:2020-07-15 04:36:05

标签: python pandas datetime

我有一个数据框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')

1 个答案:

答案 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

另一个选择可能是将.applylambda一起使用。做一个不错的1-liner,但我估计这还不算有效:

df['LOCtime'] = df.apply(lambda r: r['UTCtime'].tz_convert(r['Timezone']), axis=1)