如何按星期几和一天中的小时过滤pandas DatetimeIndex
过滤Pandas DatetimeIndex以匹配指定(星期几, 小时)组合
刚好我之前处理过类似的需求,给你分享一个简洁高效的解决方案,完全能满足你保留指定(星期几, 小时)组合时间戳的需求。
先从构造示例数据开始(和你的输入一致)
先把你给出的示例转换成可运行的代码,方便后续测试:
import pandas as pd # 构造你的示例DataFrame data = {'value': [1, 2, 3, 4, 5, 6, 7]} time_index = pd.DatetimeIndex([ '2016-04-02 06:30:00', '2016-04-02 06:45:00', '2016-04-02 07:00:00', '2016-04-02 07:15:00', '2016-04-03 07:30:00', '2016-04-03 07:45:00', '2016-04-03 08:00:00' ]) df = pd.DataFrame(data, index=time_index)
定义你的有效时间组合
就是你给出的列表,这里要注意Pandas的dayofweek规则:0代表周一,4是周五,5是周六,刚好和你的需求对应:
valid_day_hour = [(4, 6), (5, 7)]
核心过滤逻辑
我们可以利用DatetimeIndex的dayofweek和hour属性,把每个时间戳转换成(星期几, 小时)的元组,再用isin()判断是否在有效列表里。这里有两种写法,你可以选顺手的:
写法1:直观的列表推导式(适合小数据集)
# 生成每个时间戳的(星期几, 小时)元组 day_hour_pairs = list(zip(df.index.dayofweek, df.index.hour)) # 生成布尔掩码:True表示符合条件 filter_mask = [pair in valid_day_hour for pair in day_hour_pairs] # 过滤得到结果 filtered_df = df[filter_mask]
写法2:向量化操作(适合大数据集,效率更高)
# 用apply把每个时间戳转换成元组,再判断是否在有效列表中 filtered_df = df[ df.index.to_series().apply(lambda ts: (ts.dayofweek, ts.hour)).isin(valid_day_hour) ]
查看最终结果
运行后filtered_df的输出完全符合你的预期:
value 2016-04-02 06:30:00 1 2016-04-02 06:45:00 2 2016-04-03 07:30:00 5
额外小提示
如果之后需要扩展条件(比如匹配某个小时范围,比如周五的6-8点),可以调整判断逻辑,比如:
# 示例:保留周五(dayofweek=4)6-8点的所有时间戳 extended_mask = (df.index.dayofweek == 4) & (df.index.hour.between(6, 8)) extended_filtered_df = df[extended_mask]
内容的提问来源于stack exchange,提问作者motam79
相关产品推荐
相关产品推荐

