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

CSV时间列解析、毫秒平均及时间校正问题求助

CSV时间列解析、毫秒平均及时间校正问题求助

看起来你遇到了CSV时间格式解析错误、毫秒平均逻辑适配以及时间校正偏差的问题,我来帮你一步步梳理并修正代码:

问题根源分析

  1. 时间格式解析错误:你的CSV时间是MM:SS.f格式(比如23:02.0实际是23分02秒0毫秒),但代码里用%I:%M:%S(12小时制的HH:MM:SS)解析,错误地把23当成了小时,导致后续时间校正完全偏离预期。
  2. 毫秒平均逻辑不匹配:原始代码提取时间前8位的逻辑只适用于HH:MM:SS.fff格式,对你的短格式时间无效,而且分组平均的前提是先把时间正确解析到秒级。
  3. 缺少小时信息:从你的例子来看,这些短时间对应的完整时间应该包含固定小时(比如10:23:02),需要补全这部分信息才能进行正确的时间计算。

修正后的完整代码

假设你的CSV时间列是MM:SS.f格式,且所有时间都属于同一个固定小时(比如10点),以下是修正后的代码:

import pandas as pd
import numpy as np
import os
from datetime import timedelta
from tkinter import Tk, filedialog, messagebox

def upload_files(prompt_message):
    root = Tk()
    root.withdraw()  # Hide the root window
    file_paths = filedialog.askopenfilenames(title=prompt_message)  # Allow multiple file selection
    return file_paths

def create_new_filename(file_path):
    base_name = os.path.basename(file_path)  # Extract the file name with extension
    file_name, file_extension = os.path.splitext(base_name)  # Split name and extension
    new_file_name = f"{file_name}_Processed{file_extension}"  # Append suffix to the name
    return new_file_name

def safe_interp(x, xp, fp):
    y = np.interp(x, xp, fp, left=0, right=0)
    y[x < xp.min()] = 0
    y[x > xp.max()] = 0
    return y

def process_time_column(df, time_column, fixed_hour=10):
    # 处理MM:SS.f格式的时间,补全为标准HH:MM:SS格式
    df[time_column] = df[time_column].astype(str).str.strip()
    # 拆分秒和毫秒部分
    df[['minutes_seconds', 'millis']] = df[time_column].str.split('.', expand=True)
    # 拆分分钟和秒部分
    df[['minutes', 'seconds']] = df['minutes_seconds'].str.split(':', expand=True)
    # 补全固定小时,生成标准时间格式
    df['Time'] = f"{fixed_hour:02d}:" + df['minutes'] + ":" + df['seconds']
    # 保留原始时间用于验证
    df['Original_Time'] = df[time_column]
    # 清理临时列
    df = df.drop(columns=['minutes_seconds', 'millis', 'minutes', 'seconds'])
    return df

def average_by_second(df):
    numeric_columns = df.select_dtypes(include=['float64', 'int64']).columns
    # 按整秒时间分组,对数值列求平均
    df_grouped = df.groupby('Time')[numeric_columns].mean().reset_index()
    # 合并非数值列,保留每个时间的第一个实例
    df_final = pd.merge(df_grouped, df.drop(columns=numeric_columns).drop_duplicates('Time'), on='Time', how='left')
    return df_final.round(5)

def apply_time_correction(df):
    time_correction = timedelta(hours=1, minutes=10, seconds=25)
    # 用24小时制解析时间,确保减法计算正确
    df['corrected_time'] = (pd.to_datetime(df['Time'], format='%H:%M:%S') - time_correction).dt.time
    return df

# 示例使用流程
if __name__ == "__main__":
    file_paths = upload_files("请选择要处理的CSV文件")
    for file_path in file_paths:
        df = pd.read_csv(file_path)
        # 替换成你CSV里实际的时间列名
        df = process_time_column(df, time_column='Time_Column', fixed_hour=10)
        df = average_by_second(df)
        df = apply_time_correction(df)
        # 保存处理后的文件
        new_file_path = os.path.join(os.path.dirname(file_path), create_new_filename(file_path))
        df.to_csv(new_file_path, index=False)
        messagebox.showinfo("处理完成", f"文件已保存至:{new_file_path}")

关键修正点说明

  1. 时间格式修复:新增的process_time_column函数专门处理短格式时间,拆分分钟、秒部分,补全固定小时(你可以根据实际数据修改fixed_hour参数),生成标准的HH:MM:SS格式用于后续分组。
  2. 毫秒平均逻辑:现在基于正确解析的整秒时间分组,确保同一秒内的所有毫秒数据被正确平均。
  3. 时间校正修复:改用%H:%M:%S(24小时制)解析时间,避免12小时制的格式错误,确保时间减法计算符合预期。

额外建议

  • 如果你的CSV里有单独的小时列,或者时间格式有其他变化,可以修改process_time_column函数,动态读取小时信息。
  • 处理前可以先打印几行数据验证格式解析是否正确:print(df[['Original_Time', 'Time']].head())

备注:内容来源于stack exchange,提问作者Pushkar K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:53:08