Pandas处理混合格式Timestamp列并重采样补全5分钟间隔缺失时间戳
时间格式不统一问题解决方案
核心思路
利用数据集本身是固定5分钟间隔时序数据的特性,对每行时间字符串尝试匹配所有可能的格式,再结合前后行的时间间隔校验,选择符合时序逻辑的解析结果,避免pandas默认自动推断的误差。
具体实现步骤
- 步骤1:预先定义所有可能出现的时间格式列表,可根据实际数据情况增减条目
POSSIBLE_FORMATS = [ "%d/%m/%Y %H:%M", # 原始标准格式 日/月/4位年 "%d%m%y %H:%M", # 无分隔符 日月2位年 "%d/%m/%y %H:%M", # 有分隔符 日月2位年 "%m/%d/%Y %H:%M", # 月/日/4位年 "%m%d%Y %H:%M" # 无分隔符 月日4位年 ] - 步骤2:编写带时序校验的自定义解析函数,利用5分钟间隔的规律做正确性校验
import pandas as pd from datetime import timedelta def parse_ts(ts_str, prev_ts=None): # 遍历所有格式尝试解析 for fmt in POSSIBLE_FORMATS: try: parsed = pd.to_datetime(ts_str, format=fmt) # 存在上一行时间时,校验是否符合5分钟间隔规则,允许1秒误差 if prev_ts is not None: if abs((parsed - prev_ts).total_seconds() - 300) < 1: return parsed # 首行无前置时间,暂存解析结果待后续校验 else: return parsed except ValueError: continue # 所有格式都解析失败返回空值 return pd.NaT # 逐行解析时间列 parsed_ts = [] prev = None for ts_str in df['Timestamp']: current = parse_ts(ts_str, prev) # 处理首行解析结果:用第二行的解析结果反推首行正确值,避免首行格式不对导致后续全部偏移 if len(parsed_ts) == 1 and prev is not None: expected_first = current - timedelta(minutes=5) if expected_first != prev: first_str = df['Timestamp'].iloc[0] for fmt in POSSIBLE_FORMATS: try: new_first = pd.to_datetime(first_str, format=fmt) if new_first == expected_first: parsed_ts[0] = new_first prev = new_first break except: pass parsed_ts.append(current) prev = current df['Timestamp'] = parsed_ts - 步骤3:处理少量解析失败的空值,再执行重采样逻辑
# 少量解析失败的空值用前向填充补全 df['Timestamp'] = df['Timestamp'].ffill() # 原有重采样逻辑可直接复用,无需额外转字符串再转时间的冗余操作 start_dt = df.loc[0, "Timestamp"] end_dt = df["Timestamp"].iloc[-1] r = pd.date_range(start=start_dt, end=end_dt, freq="5min") df = df.set_index('Timestamp').reindex(r).rename_axis("Timestamp").reset_index()
内容的提问来源于stack exchange,提问作者snehal virwadekar
相关产品推荐
相关产品推荐

