基于Python实现时间序列截断与统计特征提取需求
解决方案
步骤1:导入必备工具库
先把需要用到的Python库导入,这些都是初学者容易上手的基础库:
import pandas as pd from datetime import datetime, timedelta import os
步骤2:加载主患者数据集
假设你的主数据集是CSV格式(比如叫patient_list.csv),里面包含ID和Date point两列。首先要把时间列转成可计算的格式,不然没法算48小时的时间范围:
# 读取主数据集 main_data = pd.read_csv('patient_list.csv') # 把Date point转成datetime类型,这步是时间计算的关键 main_data['Date point'] = pd.to_datetime(main_data['Date point'])
步骤3:处理单个患者的时间序列文件
循环遍历每个患者,找到对应的同名文本文件,筛选出Date point前48小时内的数据,再计算统计量:
# 用来存最终统计结果的空列表 final_stats = [] for _, patient in main_data.iterrows(): pid = patient['ID'] # 计算截断时间:Date point往前推48小时 cutoff_time = patient['Date point'] - timedelta(hours=48) # 拼接时间序列文件路径 file_path = f"{pid}.txt" # 先检查文件是否存在,避免报错 if not os.path.exists(file_path): print(f"提示:找不到患者{pid}的时间序列文件") # 缺失文件的话用NaN填充统计值 final_stats.append({ 'ID': pid, '均值': float('nan'), '最大值': float('nan'), '最小值': float('nan'), '有效数据量': 0 }) continue # 读取时间序列文件,假设每行是「时间,数值」格式 ts_data = pd.read_csv(file_path, names=['时间', '数值'], header=None) # 同样把时间列转成datetime类型 ts_data['时间'] = pd.to_datetime(ts_data['时间']) # 筛选出48小时窗口内的数据 filtered_data = ts_data[(ts_data['时间'] >= cutoff_time) & (ts_data['时间'] <= patient['Date point'])] # 计算统计量 if filtered_data.empty: # 窗口内没有有效数据的情况 stats = { 'ID': pid, '均值': float('nan'), '最大值': float('nan'), '最小值': float('nan'), '有效数据量': 0 } else: stats = { 'ID': pid, '均值': filtered_data['数值'].mean(), '最大值': filtered_data['数值'].max(), '最小值': filtered_data['数值'].min(), '有效数据量': len(filtered_data) } final_stats.append(stats)
步骤4:生成统计结果DataFrame
把收集到的统计数据转成DataFrame,还可以保存成文件方便后续使用:
# 转成DataFrame格式 stats_df = pd.DataFrame(final_stats) # 按ID排序(可选) stats_df = stats_df.sort_values('ID').reset_index(drop=True) # 查看结果 print(stats_df.head()) # 保存到CSV文件(可选) stats_df.to_csv('patient_stats.csv', index=False)
新手注意事项
- 时间格式适配:如果你的时间格式不是默认的
YYYY-MM-DD HH:MM:SS,可以给pd.to_datetime加format参数,比如pd.to_datetime(ts_data['时间'], format='%Y/%m/%d %H:%M') - 文件路径调整:如果时间序列文件都在某个文件夹里,把
file_path改成f"你的文件夹名/{pid}.txt" - 异常处理:如果遇到文件格式混乱、数值不是数字的情况,可以加
try-except块避免程序崩溃,比如:
try: ts_data['数值'] = pd.to_numeric(ts_data['数值'], errors='coerce') except Exception as e: print(f"患者{pid}的文件解析出错:{e}")
内容的提问来源于stack exchange,提问作者Romain LOMBARDI
相关产品推荐
相关产品推荐

