Python中将毫秒时间戳转换为datetime的时长计算异常问题
问题排查与代码修正
核心问题分析
你遇到的时长异常,大概率和代码的低效循环、时间计算的冗余操作有关,也可能是time.stamp的单位或数据本身存在偏差。先从代码优化和问题排查入手:
第一步:排查原始数据
先确认time.stamp的最大值是否符合预期:
print(df['time.stamp'].max())
60分钟的10Hz采样对应的最大偏移毫秒数应为60*60*1000=3600000。如果输出远小于这个值,说明原始数据的time.stamp本身有问题;如果数值符合,再看时间计算逻辑。
修正后的代码
替换原循环逻辑,用pandas矢量化操作更高效可靠:
import os import pandas as pd from datetime import datetime flist = os.listdir(data_files) for f in flist: # 读取文件,用os.path.join避免路径拼接错误 df = pd.read_csv(os.path.join(data_files, f)) # 从文件名解析起始时间 yyyymmdd, hhmm, _ = f.split(".") # 直接构造起始datetime对象,避免字符串解析的冗余和错误 start_dt = datetime( year=int(yyyymmdd[:4]), month=int(yyyymmdd[4:6]), day=int(yyyymmdd[6:8]), hour=int(hhmm[:2]), minute=int(hhmm[2:4]), second=0 # 若实际起始秒不为0,替换为对应数值 ) # 矢量化计算所有时间戳,比循环快数十倍 df['datetime'] = start_dt + pd.to_timedelta(df['time.stamp'], unit='ms') # 格式化为yyyy-mm-dd hh:min:sec.milliseconds格式 # %f是6位微秒,[:-3]截取前3位转为毫秒 df['datetime'] = df['datetime'].dt.strftime('%Y-%m-%d %H:%M:%S.%f').str[:-3] # 保存文件 df.to_csv(os.path.normpath(os.path.join(data_dummy_files, f)), index=False)
额外排查点
如果修正后时长仍异常,检查以下两点:
- 确认
time.stamp的单位:如果实际是秒,把unit='ms'改成unit='s';如果是微秒,改成unit='us'。 - 检查数据行数:60分钟10Hz采样应有
60*60*10=36000行,若行数只有2400行(对应4分钟),说明原始数据文件不完整。
内容的提问来源于stack exchange,提问作者Gianni Spear
相关产品推荐
相关产品推荐

