如何将CSV中10Hz采样的不规范时间戳转为统一带毫秒格式?
修复CSV时间戳格式统一问题(解决原代码空DataFrame问题)
原代码核心问题分析
- CSV读取错误:错误使用
skiprows=1, header=None, names=['timestamp'],导致仅读取单列数据,丢失所有传感器属性列,且表头解析混乱。 - 基准时间行未收集:遇到完整时间戳时仅初始化
base_time,未将格式化后的时间戳加入结果列表,直接丢失这部分有效数据。 - 偏移量计算错误:将
00:00.1拆分后错误地将毫秒部分乘以100,导致时间增量计算偏差(实际00.1代表0.1秒,而非10毫秒)。 - 未处理边界情况:未考虑
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
相关产品推荐
相关产品推荐

