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

如何在Pandas DataFrame中填充Time列缺失的连续秒级时间值

填充Pandas DataFrame中缺失的连续秒级时间值

问题描述

DataFrame的Time列中存在以'0'表示的缺失值,需要将这些值替换为前一个有效时间的下一秒,形成连续递增的秒级时间序列。

原始数据

import pandas as pd

df = pd.DataFrame({
    'sec': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'Date': ['7/7', '0', '0', '7/7', '7/7', '0', '7/7', '7/7', '0', '0'],
    'Time': ['12:47:30', '0', '0', '12:47:33', '12:47:34', '0', '12:47:36', '12:47:37', '0', '0'],
    'rpm': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
})

解决方法

方法1:适用于整体时间序列连续的场景

如果所有有效时间本身就是连续的(仅中间存在'0'缺失值,无时间跳变),可以直接从第一个有效时间生成连续秒级序列:

from datetime import datetime, timedelta

# 将'0'转为缺失值,同时转换为datetime类型
df['Time'] = pd.to_datetime(df['Time'], format='%H:%M:%S', errors='coerce')

# 获取起始时间,生成连续时间序列
start_time = df['Time'].dropna().iloc[0]
df['Time'] = [start_time + timedelta(seconds=i) for i in range(len(df))]

# 转换回字符串格式(按需选择)
df['Time'] = df['Time'].dt.strftime('%H:%M:%S')

方法2:通用方法,支持时间跳变场景

如果数据中存在时间跳变(比如某个有效时间与前一个有效时间的间隔大于行数差),可以通过分组填充处理每个区间的缺失值:

# 将'0'转为缺失值,转换为datetime类型
df['Time'] = pd.to_datetime(df['Time'], format='%H:%M:%S', errors='coerce')

# 按有效时间划分分组:每个有效时间开启一个新组
df['group'] = df['Time'].notna().cumsum()

# 对每个分组,从组内第一个有效时间开始,按行递增1秒
df['Time'] = df.groupby('group').apply(
    lambda x: x['Time'].iloc[0] + pd.to_timedelta(x.index - x.index[0], unit='s')
).reset_index(drop=True)

# 转换回字符串格式并移除临时分组列
df['Time'] = df['Time'].dt.strftime('%H:%M:%S')
df.drop('group', axis=1, inplace=True)

最终输出

执行代码后Time列将被填充为连续秒级时间,结果如下:

print(df)
# 输出:
    sec Date      Time  rpm
0     1  7/7  12:47:30  0.0
1     2    0  12:47:31  0.0
2     3    0  12:47:32  0.0
3     4  7/7  12:47:33  0.0
4     5  7/7  12:47:34  0.0
5     6    0  12:47:35  0.0
6     7  7/7  12:47:36  0.0
7     8  7/7  12:47:37  0.0
8     9    0  12:47:38  0.0
9    10    0  12:47:39  0.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 23:15:06