如何按指定日期对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
相关产品推荐
相关产品推荐

