使用步骤对 pandas DateTimeIndex 进行切片
Slicing pandas DateTimeIndex with steps
我经常使用 DateTimeIndexes 处理 pandas DataFrame,我想在其中 - 例如 - select 仅索引小时 = 6 的部分。我目前知道的唯一方法要做到这一点是重新索引:
df.reindex(pd.date_range(*df.index.to_series().agg([min, max]).apply(lambda ts: ts.replace(hour=6)), freq="24H"))
但这非常难读且复杂,当存在具有多个 DateTimeIndex 级别的 MultiIndex 时,情况会变得更糟。我知道使用 .reset_index() 然后使用 df.where 或 df.loc 条件语句的方法,但是有没有更简单的方法来使用常规 IndexSlicing 来做到这一点?我试了下
df.loc[df.index.min().replace(hour=6)::pd.Timedelta(24, unit="H")]
但这给出了 TypeError:
TypeError: '>=' not supported between instances of 'Timedelta' and 'int'
如果您的索引是 DatetimeIndex,您可以使用:
>>> df[df.index.hour == 6]
val
2022-03-01 06:00:00 7
2022-03-02 06:00:00 31
2022-03-03 06:00:00 55
2022-03-04 06:00:00 79
2022-03-05 06:00:00 103
2022-03-06 06:00:00 127
2022-03-07 06:00:00 151
2022-03-08 06:00:00 175
2022-03-09 06:00:00 199
2022-03-10 06:00:00 223
2022-03-11 06:00:00 247
2022-03-12 06:00:00 271
2022-03-13 06:00:00 295
2022-03-14 06:00:00 319
2022-03-15 06:00:00 343
2022-03-16 06:00:00 367
2022-03-17 06:00:00 391
2022-03-18 06:00:00 415
2022-03-19 06:00:00 439
2022-03-20 06:00:00 463
2022-03-21 06:00:00 487
设置:
dti = pd.date_range('2022-3-1', '2022-3-22', freq='1H')
df = pd.DataFrame({'val': range(1, len(dti)+1)}, index=dti)
我经常使用 DateTimeIndexes 处理 pandas DataFrame,我想在其中 - 例如 - select 仅索引小时 = 6 的部分。我目前知道的唯一方法要做到这一点是重新索引:
df.reindex(pd.date_range(*df.index.to_series().agg([min, max]).apply(lambda ts: ts.replace(hour=6)), freq="24H"))
但这非常难读且复杂,当存在具有多个 DateTimeIndex 级别的 MultiIndex 时,情况会变得更糟。我知道使用 .reset_index() 然后使用 df.where 或 df.loc 条件语句的方法,但是有没有更简单的方法来使用常规 IndexSlicing 来做到这一点?我试了下
df.loc[df.index.min().replace(hour=6)::pd.Timedelta(24, unit="H")]
但这给出了 TypeError:
TypeError: '>=' not supported between instances of 'Timedelta' and 'int'
如果您的索引是 DatetimeIndex,您可以使用:
>>> df[df.index.hour == 6]
val
2022-03-01 06:00:00 7
2022-03-02 06:00:00 31
2022-03-03 06:00:00 55
2022-03-04 06:00:00 79
2022-03-05 06:00:00 103
2022-03-06 06:00:00 127
2022-03-07 06:00:00 151
2022-03-08 06:00:00 175
2022-03-09 06:00:00 199
2022-03-10 06:00:00 223
2022-03-11 06:00:00 247
2022-03-12 06:00:00 271
2022-03-13 06:00:00 295
2022-03-14 06:00:00 319
2022-03-15 06:00:00 343
2022-03-16 06:00:00 367
2022-03-17 06:00:00 391
2022-03-18 06:00:00 415
2022-03-19 06:00:00 439
2022-03-20 06:00:00 463
2022-03-21 06:00:00 487
设置:
dti = pd.date_range('2022-3-1', '2022-3-22', freq='1H')
df = pd.DataFrame({'val': range(1, len(dti)+1)}, index=dti)