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

如何按指定日期对numpy数组进行掩码筛选操作?

问题根因

原有代码日期判断失效的核心原因是类型/精度不匹配:time[i]是带时分秒精度的pandas.Timestamp对象,直接和仅包含年月日的日期字符串做相等判断,永远返回False,自然无法命中符合条件的时间点。
另外逐行循环遍历生成掩码的写法性能很差,时间序列数据量较大时运行效率极低,优先用pandas原生的向量化操作实现。

实现方案

1. 原循环逻辑修正

如果要保留原有循环写法,只需要把时间点的日期部分提取出来,再和目标日期做对比即可,注意取Series位置元素用.iloc避免索引歧义:

import pandas as pd
import numpy as np

time = pd.date_range("2021-09-09 04:22:00", "2021-09-10 19:59:00", freq="1min")
time = pd.Series(time, time)

target_date = pd.to_datetime('2021-09-09').date()
out = np.full(time.shape, False)

for i in range(time.shape[0]):
    current_ts = time.iloc[i]
    # 先匹配日期,再匹配时段
    if current_ts.date() == target_date:
        if 4 <= current_ts.hour <= 6:
            out[i] = True

2. 推荐:向量化掩码实现(无循环,性能最优)

直接利用pandas时间序列的内置属性生成布尔掩码,不需要逐行遍历,代码更简洁、运行速度快几个数量级:

import pandas as pd
import numpy as np

time = pd.date_range("2021-09-09 04:22:00", "2021-09-10 19:59:00", freq="1min")
time_series = pd.Series(time, index=time)

target_date = '2021-09-09'
# 直接生成numpy格式的布尔掩码
out = (
    # 匹配目标日期
    (time_series.dt.date == pd.to_datetime(target_date).date())
    # 匹配4-6点时段
    & (time_series.dt.hour.between(4, 6))
).to_numpy()

性能优化提示

如果后续需要筛选日期段而非单个日期,用时间边界比较的写法比提取.dt.date性能更高,可直接利用时间索引的排序特性加速:

# 筛选2021-09-09全天4-6点的高性能写法
out = (
    (time_series >= '2021-09-09')
    & (time_series < '2021-09-10')
    & (time_series.dt.hour.between(4, 6))
).to_numpy()

内容的提问来源于stack exchange,提问作者a7dc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:45:32