CSV导入数据后补全指定时间范围缺失1分钟时间戳求助
解决分钟级时间戳缺失补全的问题
嘿,我来帮你搞定这个时间戳补全的麻烦!你遇到的asfreq('t')返回超出范围值的问题,核心原因是这个方法会生成从数据最早到最晚时间的连续分钟序列,包括中间的非交易日(比如你示例里的02-04、05-07这些没有数据的日期),而你用between_time过滤后,这些非交易日的09:16-15:30数据也会被保留,看起来就像“超出范围”的无效数据。
下面是针对性的解决方案,一步步来:
步骤1:确保时间列是DatetimeIndex
首先读取CSV时,要把时间列解析为日期时间格式,并设置为索引:
import pandas as pd # 假设你的CSV列是['datetime', 'value'],根据实际列名调整 df = pd.read_csv('your_data.csv', parse_dates=['datetime'], index_col='datetime')
步骤2:按交易日分组补全时间戳
我们只需要对有数据的交易日生成09:16-15:30的完整分钟序列,避免生成非交易日的无效数据:
# 提取所有存在数据的交易日 trading_days = df.index.date.unique() # 初始化空DataFrame存储补全后的数据 filled_df = pd.DataFrame() for day in trading_days: # 生成当天09:16到15:30的完整分钟时间戳 day_start = pd.Timestamp(f"{day} 09:16") day_end = pd.Timestamp(f"{day} 15:30") full_minute_index = pd.date_range(start=day_start, end=day_end, freq='T') # 提取当天的原始数据 daily_data = df.loc[str(day)] # 重新索引到完整时间序列,这里用前向填充(ffill),可根据需求替换 filled_daily = daily_data.reindex(full_minute_index, method='ffill') # 合并到结果中 filled_df = pd.concat([filled_df, filled_daily]) # 最后按时间排序 filled_df = filled_df.sort_index()
步骤3:选择合适的缺失值填充方式
如果你不想用前向填充(ffill),可以根据业务需求替换成其他方式:
- 后向填充:
method='bfill' - 线性插值(基于时间的插值更准确):
filled_daily = daily_data.reindex(full_minute_index).interpolate(method='time')
为什么之前的方法不行?
直接用df.asfreq('T').between_time('09:16', '15:30')会生成从最早数据(01-04 09:16)到最晚数据(08-04 09:36)之间的所有分钟,包括02-04、05-07这些没有交易数据的日期的09:16-15:30,这些就是你看到的“超出范围”的值。而按交易日分组补全,只会处理有原始数据的日期,完全避免无效数据。
内容的提问来源于stack exchange,提问作者Pavan Yasasvi
相关产品推荐
相关产品推荐

