Pandas 带有时间戳的DataFrame列,需要本地化多个不同的时区(AttributeError:只能使用带有datetimelike值的.dt访问器)

Pandas 带有时间戳的DataFrame列,需要本地化多个不同的时区(AttributeError:只能使用带有datetimelike值的.dt访问器),pandas,datetime,Pandas,Datetime,我有一个数据帧(6百万行),有两列,一列包含本地时间(时区),另一列包含时区。大概是这样的: | | SCHEDULED_DEPARTURE | ORIGIN_TZ | |---:|:----------------------|:--------------------| | 0 | 2020-11-30 11:40:00 | America/New_York | | 1 | 2020-11-30 16:51:00 | America/New_Y

我有一个数据帧(6百万行),有两列,一列包含本地时间(时区),另一列包含时区。大概是这样的:

|    | SCHEDULED_DEPARTURE   | ORIGIN_TZ           |
|---:|:----------------------|:--------------------|
|  0 | 2020-11-30 11:40:00   | America/New_York    |
|  1 | 2020-11-30 16:51:00   | America/New_York    |
|  2 | 2020-11-30 09:05:00   | America/Chicago     |
|  3 | 2020-11-30 19:18:00   | America/Chicago     |
|  4 | 2020-11-30 10:36:00   | America/New_York    |
|  5 | 2020-11-30 12:10:00   | America/Los_Angeles |
|  6 | 2020-11-30 16:05:00   | America/New_York    |
|  7 | 2020-11-30 12:14:00   | America/New_York    |
|  8 | 2020-11-30 16:05:00   | America/New_York    |
|  9 | 2020-11-30 12:40:00   | America/Chicago     |
我试图使用a
for
例程对
df
的每一行进行本地化,该例程将
df
按每个时区进行子集,添加时区,并保持循环:

df['ORIGIN_tz']中的tz的
。唯一()
掩码_-tz=(df['ORIGIN_-tz']==tz)
df.loc[mask_-tz,'SCHEDULED_-deposition']=df.loc[mask_-tz,'SCHEDULED_-deposition'].dt.tz本地化(tz)
奇怪的是,它有时工作,有时返回以下错误:

AttributeError:只能对datetimelike值使用.dt访问器


提取
SCHEDULED_offering
列时,类型明显为datetime,如:

Name: SCHEDULED_DEPARTURE, Length: 5714008, dtype: datetime64[ns]

你知道怎么解决这个问题吗?每列是否可能有超过1个时区


下面是复制示例df的代码:

df=pd.DataFrame({'SCHEDULED_deeption':{0:pd.Timestamp('2020-11-30 10:15:00')、1:pd.Timestamp('2020-11-30 07:55:00')、2:pd.Timestamp('2020-11-30 06:00:00')、3:pd.Timestamp('2020-11-30 16:23:00')、4:pd.Timestamp('2020-11-30 07:35:00')、5:pd.Timestamp('2020-11-30 08:00')、6:pd.Timestamp('2020-11-11-30:30:50:00')、08:00')('2020-11-30 13:45:00')、8:pd.时间戳('2020-11-30 10:15:00')、9:pd.时间戳('2020-11-30 20:00:00')、'OriginationúTZ':{0:'美国/纽约'、1:'美国/纽约'、2:'美国/丹佛'、3:'美国/纽约'、4:'美国/芝加哥'、6:'美国/洛杉矶'、7:'美国/芝加哥'、8:'美国/纽约'、9:'美国/洛杉矶')})
一旦您这样做:

df.loc[mask_tz,'SCHEDULED_DEPARTURE'] = df.loc[mask_tz,'SCHEDULED_DEPARTURE'].dt.tz_localize(tz)
您的列变为对象数据类型,下一次
.dt
访问失败。请尝试处理副本:

s = df['SCHEDULED_DEPARTURE'].copy()
for tz in df['ORIGIN_TZ'].unique():
    mask_tz = (df['ORIGIN_TZ'] == tz)
    df.loc[mask_tz,'SCHEDULED_DEPARTURE'] = s.loc[mask_tz].dt.tz_localize(tz)
然后,
df.loc[0,'SCHEDULED_execution']
将给出:

Timestamp('2020-11-30 10:15:00-0500', tz='America/New_York')

您的
SCHEDULED\u execution
列仍然是
object
dtype。

您太棒了,非常感谢