如何从Pandas DateTimeIndex序列提取多日完整时段数据?
问题:Pandas DateTimeIndex提取多日全时段数据异常
我尝试从Pandas DateTimeIndex序列中提取随机多天的完整时段数据,但传入日期列表时仅返回当日首个小时的数据;提取单日数据则正常。
代码示例
import pandas as pd dt = pd.date_range('11-1-2022','11-4-2022',freq='6H').to_series()
提取单日(正常返回全时段)
In [204]: dt['11-3-2022'] Out[204]: 2022-11-03 00:00:00 2022-11-03 00:00:00 2022-11-03 06:00:00 2022-11-03 06:00:00 2022-11-03 12:00:00 2022-11-03 12:00:00 2022-11-03 18:00:00 2022-11-03 18:00:00 Freq: 6H, dtype: datetime64[ns]
提取多日(仅返回当日首个时段)
In [205]: dt[['11-1-2022','11-3-2022']] Out[205]: 2022-11-01 2022-11-01 2022-11-03 2022-11-03 dtype: datetime64[ns]
解决方案
问题根源是:传入字符串列表索引时,Pandas会自动将字符串匹配为索引的日期截断值(仅保留日部分),仅返回每个日期的第一个匹配项。以下是几种可行的解决方法:
方法1:通过dt.date筛选
提取索引的日期部分,再与目标日期列表匹配:
target_dates = {'2022-11-01', '2022-11-03'} # 将目标日期转为datetime对象后提取日期部分 target_date_objs = pd.to_datetime(list(target_dates)).date result = dt[dt.index.date.isin(target_date_objs)]
方法2:用loc构造日期范围切片
对每个目标日期构造当日的完整时间范围,再合并结果:
target_dates = ['2022-11-01', '2022-11-03'] result = pd.concat([dt.loc[date:date+' 23:59:59'] for date in target_dates])
方法3:使用floor取整后匹配
将索引向下取整到日,再与目标日期匹配:
target_dates = pd.to_datetime(['2022-11-01', '2022-11-03']) result = dt[dt.index.floor('D').isin(target_dates)]
以上方法均可返回指定日期的所有6小时时段数据,比如方法1的输出会包含2022-11-01和2022-11-03的全部4个时段数据。
内容的提问来源于stack exchange,提问作者kbk78
相关产品推荐
相关产品推荐

