如何编写函数实现DataFrame按时间差删行与补行操作?
解决方案
步骤说明
- 读取并清洗原始数据:读取文本文件,解析时间格式,过滤格式错误的行
- 过滤短时间间隔的行:移除连续两行时间差小于2分钟的冗余记录
- 补全长时间间隔的缺失行:当连续两行时间差超过2分钟时,按2分钟间隔插入空记录(
Movement字段为None)
完整实现代码
import pandas as pd from datetime import datetime # 读取并清洗原始数据 data = [] with open("bird_jan25jan16.txt") as f: for line in f: try: date_str, time, movement = line.split() dt_str = date_str + ' ' + time # 解析带毫秒的时间格式 dt = datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S.%f") data.append([dt, movement]) except ValueError: # 处理格式异常的行,直接忽略 print(f"忽略异常行: {line.strip()}") # 转换为DataFrame并按时间排序 df = pd.DataFrame(data, columns=["Datetime", "Movement"]) df = df.sort_values("Datetime").reset_index(drop=True) print("原始清洗后的数据:\n", df) # ------------------------------ # 1. 过滤连续时间差小于2分钟的行 # ------------------------------ # 计算相邻行的时间差(单位:分钟) df["time_diff"] = df["Datetime"].diff().dt.total_seconds() / 60 # 保留第一行,以及时间差≥2分钟的后续行 filtered_df = df[(df["time_diff"] >= 2) | (df["time_diff"].isna())].drop(columns=["time_diff"]) print("\n过滤短间隔后的数据:\n", filtered_df) # ------------------------------ # 2. 补全长时间间隔的缺失行 # ------------------------------ def fill_missing_intervals(filtered_df): filled_data = [] # 添加第一行数据 filled_data.append([filtered_df.iloc[0]["Datetime"], filtered_df.iloc[0]["Movement"]]) for i in range(1, len(filtered_df)): prev_dt = filtered_df.iloc[i-1]["Datetime"] curr_dt = filtered_df.iloc[i]["Datetime"] curr_movement = filtered_df.iloc[i]["Movement"] time_diff = (curr_dt - prev_dt).total_seconds() / 60.0 # 时间差超过2分钟时,插入间隔2分钟的空记录 if time_diff > 2: # 计算需要插入的次数:总间隔//2,比如差5分钟的话,插入2分钟、4分钟两个点 insert_count = int(time_diff // 2) for j in range(1, insert_count + 1): intermediate_dt = prev_dt + pd.DateOffset(minutes=j * 2) # 确保插入的时间不超过当前行的时间 if intermediate_dt < curr_dt: filled_data.append([intermediate_dt, None]) # 添加当前行数据 filled_data.append([curr_dt, curr_movement]) # 转换为DataFrame并返回 return pd.DataFrame(filled_data, columns=["Datetime", "Movement"]) final_df = fill_missing_intervals(filtered_df) print("\n补全缺失后的最终数据:\n", final_df)
代码说明
数据读取与清洗:
- 逐行读取文本文件,拆分日期、时间、
Movement字段,解析为datetime类型 - 捕获
ValueError异常,忽略格式错误的行
- 逐行读取文本文件,拆分日期、时间、
过滤短间隔行:
- 计算相邻行的时间差(单位:分钟)
- 只保留第一行,以及与前一行时间差≥2分钟的行,确保每两条记录的间隔至少为2分钟
补全缺失行:
- 遍历过滤后的数据集,对每一对连续记录,计算时间差
- 若时间差超过2分钟,按2分钟间隔插入中间时间点,
Movement字段设为None - 插入时会检查中间时间是否小于当前行时间,避免插入超出范围的记录
内容的提问来源于stack exchange,提问作者linnsans
相关产品推荐
相关产品推荐

