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

如何按日期列表筛选带日期小时的时间序列DataFrame?

解决时间序列DataFrame按日期列表筛选全天记录的问题

我来帮你搞定这个问题!你遇到的核心问题是:当用isin直接匹配日期字符串时,只会匹配到索引中**精确等于该日期(时分秒为00:00:00)**的那条记录,而不是当天所有15分钟间隔的96条数据。下面给你几种实用的解决思路:

方法1:提取索引的日期部分进行匹配

这是最直接的方式,我们可以把DataFrame索引的日期部分单独提取出来,再和目标日期列表做匹配:

import pandas as pd

# 目标日期列表
target_dates = ['2016-11-01', '2016-11-03']
# 把目标日期转换为date对象(和索引的date属性格式一致)
target_date_objects = pd.to_datetime(target_dates).date

# 筛选索引日期在目标列表中的所有记录
filtered_df = df[df.index.date.isin(target_date_objects)]

原理:df.index.date会把每个datetime索引转换成datetime.date类型(只保留年/月/日),这样就能和我们转换后的目标日期对象完全匹配,从而拿到当天所有的15分钟记录。

方法2:利用切片+拼接实现筛选

如果你的日期索引是连续的,也可以通过对每个目标日期做全天切片,再拼接结果:

import pandas as pd

target_dates = ['2016-11-01', '2016-11-03']
# 对每个日期生成从当天到次日凌晨的切片,确保包含全天所有记录
date_slices = [df.loc[date : pd.to_datetime(date) + pd.Timedelta(days=1)] for date in target_dates]
# 拼接所有切片结果
filtered_df = pd.concat(date_slices)

原理:df.loc['2016-11-01': '2016-11-02']会自动包含2016-11-01的所有记录(到2016-11-02 00:00:00之前),刚好覆盖当天96条15分钟数据。

方法3:使用query方法简化筛选

如果你喜欢更简洁的语法,可以用query直接查询索引的日期部分:

import pandas as pd

target_dates = ['2016-11-01', '2016-11-03']
filtered_df = df.query("index.date in @target_dates")

原理:query支持直接引用外部变量(用@前缀),并且可以直接访问索引的date属性,语法更直观。

为什么之前的方法失效?

你之前用df.ix[df.index.to_datetime().isin(qwe)]时,qwe里的日期字符串会被转换成datetime.datetime类型(时分秒为00:00:00),而你的DataFrame索引是带具体时分秒的(比如2016-11-01 01:00:00),所以isin只会匹配到当天00:00:00的那条记录,自然只能拿到每天1条数据啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:40:13