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

如何在Pandas中仅按时间而非完整Datetime使用asof筛选数据行?

解决Pandas按每日固定时间筛选数据的问题

嘿,我来帮你搞定这个Pandas的时间筛选问题!首先得说,Pandas确实没有直接只输入09:04这种纯时间就能跨日期匹配的asof用法,但我们可以通过简单的索引处理,轻松实现你要的需求——找到每天截至09:04的最后一条记录,正好对应a值40和80的两行。

下面给你两种简便的实现方法:

方法一:分组 + asof精准匹配

这种方法利用asof的特性,针对每天单独构造完整的时间戳(日期+目标时间),然后找到每组中不晚于该时间的最后一条数据,效率很高:

import pandas as pd

# 你的原始DataFrame
df = pd.DataFrame(
    {'a': [10, 20, 40, 50,60,70,80,100]},
    index = pd.DatetimeIndex([
        '2018-02-27 09:01:00','2018-02-27 09:02:00',
        '2018-02-27 09:04:00','2018-02-27 09:05:00',
        '2018-03-27 09:01:00','2018-03-27 09:02:00',
        '2018-03-27 09:03:00','2018-03-27 09:05:00'
    ])
)

# 定义目标时间
target_time = pd.to_datetime('09:04:00').time()

# 按日期分组,每组用asof查找对应时间的最后一条记录
result = df.groupby(df.index.date).apply(
    lambda group: pd.Series.asof(group, pd.Timestamp(f'{group.name} {target_time}'))
)

print(result)

运行后会输出你要的两行数据:

a
2018-02-27  40
2018-03-27  80

方法二:先筛选再取每日最后一条

如果觉得上面的lambda有点绕,这个更直观的方法也能达到同样效果:先把所有时间不晚于09:04的行筛选出来,再按日期分组取每组的最后一条记录:

# 先筛选时间<=09:04的行
filtered_df = df[df.index.time <= target_time]
# 按日期分组取最后一条
result2 = filtered_df.groupby(filtered_df.index.date).last()

print(result2)

这个方法逻辑简单易懂,适合数据量不大的场景,输出结果和方法一完全一致。

两种方法都能完美解决你的需求,你可以根据自己的习惯和数据规模来选择~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:32:03