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

如何将CSV中10Hz采样的不规范时间戳转为统一带毫秒格式?

修复CSV时间戳格式统一问题(解决原代码空DataFrame问题)

原代码核心问题分析

  1. CSV读取错误:错误使用skiprows=1, header=None, names=['timestamp'],导致仅读取单列数据,丢失所有传感器属性列,且表头解析混乱。
  2. 基准时间行未收集:遇到完整时间戳时仅初始化base_time,未将格式化后的时间戳加入结果列表,直接丢失这部分有效数据。
  3. 偏移量计算错误:将00:00.1拆分后错误地将毫秒部分乘以100,导致时间增量计算偏差(实际00.1代表0.1秒,而非10毫秒)。
  4. 未处理边界情况:未考虑base_time未初始化时的偏移行,以及空值/非字符串类型的时间戳。

正确解决方案代码

import pandas as pd
from datetime import datetime, timedelta

# 读取CSV:保留前两行作为多级表头(列名+单位),读取所有列
df = pd.read_csv('file.csv', header=[0, 1])

processed_timestamps = []
base_time = None

for ts in df['TIMESTAMP']:
    # 处理空值或非字符串的无效时间戳
    if pd.isna(ts) or not isinstance(ts, str):
        processed_timestamps.append(None)
        continue

    if '/' in ts:
        # 解析完整日期时间,补充秒和毫秒为00.0
        base_time = datetime.strptime(ts, "%d/%m/%Y %H:%M")
        formatted_ts = base_time.strftime("%d/%m/%Y %H:%M:%S.0")
        processed_timestamps.append(formatted_ts)
    else:
        if not base_time:
            # 无基准时间的偏移行标记为无效
            processed_timestamps.append(None)
            continue
        
        # 解析偏移格式:支持"MM:SS.ms"或"SS.ms"结构
        parts = ts.split(':')
        total_seconds = 0.0
        if len(parts) == 2:
            minutes = float(parts[0])
            sec_ms = parts[1].split('.')
            seconds = float(sec_ms[0]) if sec_ms else 0
            milliseconds = float(sec_ms[1]) if len(sec_ms) > 1 else 0
            total_seconds = minutes * 60 + seconds + milliseconds / 10
        elif len(parts) == 1:
            sec_ms = parts[0].split('.')
            seconds = float(sec_ms[0]) if sec_ms else 0
            milliseconds = float(sec_ms[1]) if len(sec_ms) > 1 else 0
            total_seconds = seconds + milliseconds / 10
        else:
            processed_timestamps.append(None)
            continue
        
        # 计算当前时间并格式化
        current_time = base_time + timedelta(seconds=total_seconds)
        # 保留一位毫秒,截断多余小数位
        formatted_ts = current_time.strftime("%d/%m/%Y %H:%M:%S.%f")[:-5]
        processed_timestamps.append(formatted_ts)

# 替换原时间戳列,保留所有原始数据
df['TIMESTAMP'] = processed_timestamps

# 可选:保存处理后的文件
df.to_csv('processed_file.csv', index=False)

print(df)

关键修复说明

  • 完整数据读取:通过header=[0,1]保留CSV的列名和单位表头,确保所有传感器数据不丢失。
  • 基准行完整收集:处理完整时间戳时,直接将格式化后的YYYY/MM/DD HH:MM:SS.0加入结果列表,避免数据丢失。
  • 偏移量正确计算:针对00:00.1这类10Hz采样的偏移格式,将毫秒部分除以10转为秒级增量,确保时间戳间隔符合采集频率。
  • 格式统一输出:通过strftime格式化所有时间戳为带一位毫秒的完整格式,匹配需求示例。
  • 边界情况处理:增加空值、无效格式、无基准时间等场景的处理逻辑,提高代码鲁棒性。

内容的提问来源于stack exchange,提问作者juzze

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:29:49