如何按日期列表筛选带日期小时的时间序列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
相关产品推荐
相关产品推荐

