将Pandas时间间隔重采样至秒级:展开区间生成DatetimeIndex
解决方案:将时间区间DataFrame展开为逐秒时间点数据
Got it, let's work through this problem step by step to get your time interval data expanded into a second-by-second timeline with the correct status values (and NaNs for the gaps). Here's how to do it:
首先确认初始数据
先把你的原始DataFrame创建代码放出来,确保我们从同一起点出发:
import pandas as pd df = pd.DataFrame({ "start": ["2017-01-01 13:09:01", "2017-01-01 13:09:07", "2017-01-01 13:09:12"], "end": ["2017-01-01 13:09:05", "2017-01-01 13:09:09", "2017-01-01 13:09:14"], "status": ["OK", "ERROR", "OK"] })
初始数据格式:
| start | end | status |
|---|---|---|
| 2017-01-01 13:09:01 | 2017-01-01 13:09:05 | OK |
| 2017-01-01 13:09:07 | 2017-01-01 13:09:09 | ERROR |
| 2017-01-01 13:09:12 | 2017-01-01 13:09:14 | OK |
分步实现转换
Step 1:将时间字符串转为datetime类型
首先要把start和end列从字符串转为datetime对象,这是生成时间序列的基础:
df['start'] = pd.to_datetime(df['start']) df['end'] = pd.to_datetime(df['end'])
Step 2:为每个时间区间生成逐秒时间序列
对每一行数据,用pd.date_range生成从start到end的所有秒级时间点,再把这些时间序列拆分成单独行:
# 为每个区间生成完整的秒级时间序列 df['timestamps'] = df.apply(lambda row: pd.date_range(start=row['start'], end=row['end'], freq='S'), axis=1) # 将时间序列列表拆分为单独行 expanded_df = df.explode('timestamps').reset_index(drop=True)
Step 3:补全时间间隙并填充NaN
现在我们需要生成从最早开始时间到最晚结束时间的完整时间轴,把之前拆分的数据对齐到这个轴上,间隙部分自动填充NaN:
# 生成完整的秒级时间范围 full_time_range = pd.date_range(start=df['start'].min(), end=df['end'].max(), freq='S') # 将时间戳设为索引,对齐到完整时间轴 final_df = expanded_df.set_index('timestamps')['status'].reindex(full_time_range) # 重置索引,匹配目标格式的列名 final_df = final_df.reset_index().rename(columns={'index': '', 'status': 'status'})
最终结果
打印final_df就能得到你想要的格式:
| status | |
|---|---|
| 2017-01-01 13:09:01 | OK |
| 2017-01-01 13:09:02 | OK |
| 2017-01-01 13:09:03 | OK |
| 2017-01-01 13:09:04 | OK |
| 2017-01-01 13:09:05 | OK |
| 2017-01-01 13:09:06 | NaN |
| 2017-01-01 13:09:07 | ERROR |
| 2017-01-01 13:09:08 | ERROR |
| 2017-01-01 13:09:09 | ERROR |
| 2017-01-01 13:09:10 | NaN |
| 2017-01-01 13:09:11 | NaN |
| 2017-01-01 13:09:12 | OK |
| 2017-01-01 13:09:13 | OK |
| 2017-01-01 13:09:14 | OK |
小提示
- 如果需要其他时间频率(比如分钟级),只需要把
freq='S'改成freq='T'即可。 reindex方法会自动为缺失的时间点填充NaN,完美适配需求中的间隙场景。
内容的提问来源于stack exchange,提问作者r0f1
相关产品推荐
相关产品推荐

