You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按星期几和一天中的小时过滤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:35:08