【问题标题】:Pandas slice fails with list of DatetimeIndex labelsPandas 切片因 DatetimeIndex 标签列表而失败
【发布时间】:2018-10-10 21:27:39
【问题描述】:

我有一个 12x3 的数据框,用于存储 2017 年的月平均、最高和最低温度:

import pandas as pd

tavg = pd.Series([55.8, 57.2, 61.0, 63.6, 63.3, 66.7, 71.7, 72.0, 71.5, 71.5, 65.6, 61.4])
tmax = pd.Series([62.7, 62.6, 69.3, 71.9, 69.4, 72.6, 77.5, 77.3, 78.5, 80.4, 73.7, 72.4])
tmin = pd.Series([48.8, 51.8, 52.8, 55.4, 57.1, 60.9, 65.8, 66.8, 64.6, 62.5, 57.3, 50.3])

temp_df = pd.DataFrame()
temp_df['TAVG'] = tavg
temp_df['TMIN'] = tmin
temp_df['TMAX'] = tmax

dates = pd.date_range(start='2017-01-01', end='2017-12-01', freq='MS')

temp_df.index = dates

我想按标签对日期列表进行切片,例如 2017-01-01 和 2017-05-01。

单独切片每个日期都可以正常工作:

temp_df.loc['2017-01-01']

TAVG    55.8
TMIN    48.8
TMAX    62.7
Name: 2017-01-01 00:00:00, dtype: float64

temp_df.loc['2017-05-01']

TAVG    63.3
TMIN    57.1
TMAX    69.4
Name: 2017-05-01 00:00:00, dtype: float64

但是使用这些日期的列表进行切片会引发 KeyError:

temp_df.loc[['2017-01-01', '2017-05-01']]

"KeyError: "None of [['2017-01-01', '2017-05-01']] are in the [index]"

在使用 DatetimeIndex 时,是否有使用索引标签列表进行切片的特殊技巧?

【问题讨论】:

    标签: python pandas datetime slice


    【解决方案1】:

    切片失败,因为索引的类型为Timestamp。代码temp_df.loc[['2017-01-01', '2017-05-01']] 查找字符串标签。使用下面的代码将它们解析为Timestamp

    temp_df.loc[[pd.Timestamp('2017-01-01'), pd.Timestamp('2017-05-01')]]
    

    输出:

                TAVG    TMIN    TMAX
    2017-01-01  55.8    48.8    62.7
    2017-05-01  63.3    57.1    69.4
    

    要使您的代码正常工作,您需要将索引类型更改为 str

    temp_df.index = temp_df.index.astype(str)
    temp_df.loc[['2017-01-01', '2017-05-01']]
    

    输出:

                TAVG    TMIN    TMAX
    2017-01-01  55.8    48.8    62.7
    2017-05-01  63.3    57.1    69.4
    

    【讨论】:

    • 谢谢,但我不想要日期范围,只需要 2017-01-01 和 2017-05-01 这两个日期。为什么在我的案例中使用标签列表切片失败?
    猜你喜欢
    • 1970-01-01
    • 2021-04-03
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多