CSV时间列解析、毫秒平均及时间校正问题求助
CSV时间列解析、毫秒平均及时间校正问题求助
看起来你遇到了CSV时间格式解析错误、毫秒平均逻辑适配以及时间校正偏差的问题,我来帮你一步步梳理并修正代码:
问题根源分析
- 时间格式解析错误:你的CSV时间是
MM:SS.f格式(比如23:02.0实际是23分02秒0毫秒),但代码里用%I:%M:%S(12小时制的HH:MM:SS)解析,错误地把23当成了小时,导致后续时间校正完全偏离预期。 - 毫秒平均逻辑不匹配:原始代码提取时间前8位的逻辑只适用于
HH:MM:SS.fff格式,对你的短格式时间无效,而且分组平均的前提是先把时间正确解析到秒级。 - 缺少小时信息:从你的例子来看,这些短时间对应的完整时间应该包含固定小时(比如
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}")
关键修正点说明
- 时间格式修复:新增的
process_time_column函数专门处理短格式时间,拆分分钟、秒部分,补全固定小时(你可以根据实际数据修改fixed_hour参数),生成标准的HH:MM:SS格式用于后续分组。 - 毫秒平均逻辑:现在基于正确解析的整秒时间分组,确保同一秒内的所有毫秒数据被正确平均。
- 时间校正修复:改用
%H:%M:%S(24小时制)解析时间,避免12小时制的格式错误,确保时间减法计算符合预期。
额外建议
- 如果你的CSV里有单独的小时列,或者时间格式有其他变化,可以修改
process_time_column函数,动态读取小时信息。 - 处理前可以先打印几行数据验证格式解析是否正确:
print(df[['Original_Time', 'Time']].head())
备注:内容来源于stack exchange,提问作者Pushkar K
相关产品推荐
相关产品推荐

