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

如何编写函数实现DataFrame按时间差删行与补行操作?

解决方案

步骤说明

  1. 读取并清洗原始数据:读取文本文件,解析时间格式,过滤格式错误的行
  2. 过滤短时间间隔的行:移除连续两行时间差小于2分钟的冗余记录
  3. 补全长时间间隔的缺失行:当连续两行时间差超过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)

代码说明

  1. 数据读取与清洗:

    • 逐行读取文本文件,拆分日期、时间、Movement字段,解析为datetime类型
    • 捕获ValueError异常,忽略格式错误的行
  2. 过滤短间隔行:

    • 计算相邻行的时间差(单位:分钟)
    • 只保留第一行,以及与前一行时间差≥2分钟的行,确保每两条记录的间隔至少为2分钟
  3. 补全缺失行:

    • 遍历过滤后的数据集,对每一对连续记录,计算时间差
    • 若时间差超过2分钟,按2分钟间隔插入中间时间点,Movement字段设为None
    • 插入时会检查中间时间是否小于当前行时间,避免插入超出范围的记录

内容的提问来源于stack exchange,提问作者linnsans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:15:40