过滤掉熊猫每天的特定时间

时间:2021-02-19 22:17:30

标签: python pandas dataframe

给定一个数据集,其中每一行代表一个小时的样本,即每天有 24 个条目,其索引集如下

...
2020-10-22T20:00:00
2020-10-22T21:00:00
2020-10-22T22:00:00
...
2020-10-22T20:00:00
2020-10-22T20:00:00
2020-10-22T20:00:00
...

现在我想过滤掉,以便每天只剩下上午 9 点到下午 3 点之间的时间。

我知道的唯一方法是遍历数据集并在给定条件的情况下过滤每一行,但是知道 Pandas 总是有一些不涉及显式迭代的过滤技巧。

2 个答案:

答案 0 :(得分:1)

您可以使用恰当命名的 pd.DataFrame.between_time 方法。这仅在您的数据框具有 DatetimeIndex 时才有效。

数据创建

date_index = pd.date_range("2020-10-22T20:00:00", "2020-11-22T20:00:00", freq="H")
values = np.random.rand(len(dates), 1)

df = pd.DataFrame(values, index=date_index, columns=["value"])
print(df.head())
                        value
2020-10-22 20:00:00  0.637542
2020-10-22 21:00:00  0.590626
2020-10-22 22:00:00  0.474802
2020-10-22 23:00:00  0.058775
2020-10-23 00:00:00  0.904070

方法

subset = df.between_time("9:00am", "3:00pm")

print(subset.head(10))
                        value
2020-10-23 09:00:00  0.210816
2020-10-23 10:00:00  0.086677
2020-10-23 11:00:00  0.141275
2020-10-23 12:00:00  0.065100
2020-10-23 13:00:00  0.892314
2020-10-23 14:00:00  0.214991
2020-10-23 15:00:00  0.106937
2020-10-24 09:00:00  0.900106
2020-10-24 10:00:00  0.545249
2020-10-24 11:00:00  0.793243

答案 1 :(得分:0)

import pandas as pd

# sample data (strings)
data = [f'2020-10-{d:02d}T{h:02d}:00:00' for h in range(24) for d in range(1, 21)]

# series of DT values
ds = pd.to_datetime(pd.Series(data), format='%Y-%m-%dT%H:%M:%S')

# filter by hours
ds_filter = ds[(ds.dt.hour >= 9) & (ds.dt.hour <= 15)]