如何在Pandas中无需硬编码删除时间序列起始的前12小时数据
解决方案:删除时间序列前12小时数据
核心思路
因为需求是从首个数据点的绝对时间开始,删除之后12小时内的所有数据,between_time方法并不适用(它是按每日固定时间段筛选,比如"09:00"到"17:00"),正确的做法是基于首个数据点的时间戳计算出12小时后的分界点,再进行数据筛选。
完整实现步骤
- 确保索引为datetime类型:先把字符串格式的索引转换成pandas可识别的datetime类型,否则无法进行时间运算。
- 获取首个数据点的时间:直接取索引的第一个元素。
- 计算12小时后的分界时间:用首个时间加上
pd.Timedelta(hours=12)得到截止时间。 - 筛选数据:保留索引大于分界时间的行。
代码示例
import pandas as pd # 原始数据 df = pd.DataFrame({'quote_ts': ['2020-05-15 14:01:00.522517', '2020-05-15 14:01:00.599999', '2020-05-15 15:00:01.234517', '2020-05-16 14:00:00.312518', '2020-05-16 14:01:00.582517', '2020-05-17 14:00:00.122983', '2020-05-17 14:02:00.524567', '2020-05-18 14:00:00.522517'], 'price': [1000, 1200, 1300, 1000, 1400, 1800, 1900, 1600]}) # 1. 转换索引为datetime类型并设置为索引 df['quote_ts'] = pd.to_datetime(df['quote_ts']) df = df.set_index('quote_ts') # 2. 获取首个数据点的时间 first_timestamp = df.index[0] # 3. 计算12小时后的分界时间 cutoff_time = first_timestamp + pd.Timedelta(hours=12) # 4. 筛选出分界时间之后的数据 filtered_df = df[df.index > cutoff_time] print(filtered_df)
结果说明
运行后会保留2020-05-16 14:00:00.312518及之后的数据,正好是首个数据点(2020-05-15 14:01)12小时后的时间点之后的记录,完全符合需求。
通用适配
这个方案适用于任意结构的时间序列DataFrame,只要索引是datetime类型,不管首个数据点的日期时间是什么,都能准确计算并删除前12小时的数据。
内容的提问来源于stack exchange,提问作者Uqhah
相关产品推荐
相关产品推荐

