You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:15:03