【问题标题】:DataFrame column with Timestamps, need to localize multiple different timezones (AttributeError: Can only use .dt accessor with datetimelike values)带有时间戳的 DataFrame 列,需要本地化多个不同的时区(AttributeError: Can only use .dt accessor with datetimelike values)
【发布时间】:2020-11-30 21:38:48
【问题描述】:

我有一个包含 2 列的 DataFrame(6M 行),一列包含本地时间(时区幼稚),另一列包含时区。像这样的:

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

我正在尝试使用 for 例程本地化 SCHEDULED_DEPARTURE 的每一行,该例程按每个时区对 df 进行子集化,添加时区并继续循环:

for tz in df['ORIGIN_TZ'].unique():
    mask_tz = (df['ORIGIN_TZ'] == tz)
    df.loc[mask_tz,'SCHEDULED_DEPARTURE'] = df.loc[mask_tz,'SCHEDULED_DEPARTURE'].dt.tz_localize(tz)

奇怪的是,有时会起作用,而有时会返回以下错误:

AttributeError:只能将 .dt 访问器与 datetimelike 值一起使用


在提取SCHEDULED_DEPARTURE列时,类型明显是datetime-like:

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

你知道如何解决这个问题吗?每列是否可以有超过 1 个时区?


这里是复制样本df的代码:

df = pd.DataFrame({'SCHEDULED_DEPARTURE': {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:00'), 6: pd.Timestamp('2020-11-30 08:50:00'), 7: pd.Timestamp('2020-11-30 13:45:00'), 8: pd.Timestamp('2020-11-30 10:15:00'), 9: pd.Timestamp('2020-11-30 20:00:00')}, 'ORIGIN_TZ': {0: 'America/New_York', 1: 'America/New_York', 2: 'America/Denver', 3: 'America/New_York', 4: 'America/Chicago', 5: 'America/Chicago', 6: 'America/Los_Angeles', 7: 'America/Chicago', 8: 'America/New_York', 9: 'America/Los_Angeles'}})

【问题讨论】:

    标签: pandas datetime


    【解决方案1】:

    一旦你这样做:

    df.loc[mask_tz,'SCHEDULED_DEPARTURE'] = df.loc[mask_tz,'SCHEDULED_DEPARTURE'].dt.tz_localize(tz)
    

    您的列变成了 object dtype 并且下一个 .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_DEPARTURE'] 会给出:

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

    您的SCHEDULED_DEPARTURE 列仍然是object dtype。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多