如何在DataFrame每行后插入4行,每行时间依次递增1小时
问题描述
现有如下pandas DataFrame,A列为日期时间数据:
| A | B |
|---|---|
| 2015-01-10 00:00:00 | 45 |
| 2017-12-19 10:00:00 | 67 |
| 2020-09-02 21:00:00 | 87 |
需要在每一行后插入4行数据,每行时间比原行依次增加1小时,新增行的B列留空,最终得到目标结果。
解决方案
下面提供两种简洁的实现方法:
方法1:分组扩展+时间偏移
import pandas as pd # 确保A列为datetime类型(原始数据非datetime时执行) df['A'] = pd.to_datetime(df['A']) # 为每行添加唯一组标识 df['group_id'] = df.index # 每个组重复5次(原行+4条新增行) expanded_df = df.loc[df.index.repeat(5)].reset_index(drop=True) # 计算组内时间偏移:第0行偏移0小时,第1行+1h...第4行+4h expanded_df['A'] = expanded_df['A'] + pd.to_timedelta(expanded_df.groupby('group_id').cumcount(), unit='hour') # 仅保留原行(组内第0行)的B值,其余设为空 expanded_df.loc[expanded_df.groupby('group_id').cumcount() != 0, 'B'] = pd.NA # 移除临时组标识列,得到最终结果 df_new = expanded_df.drop('group_id', axis=1)
方法2:生成时间序列+explode
这种方法代码更简洁,适合中小数据量场景:
import pandas as pd # 转换A列为datetime类型 df['A'] = pd.to_datetime(df['A']) # 为每行生成包含5个连续小时时间点的序列 df['A'] = df['A'].apply(lambda dt: pd.date_range(start=dt, periods=5, freq='h')) # 展开序列为独立行 df_new = df.explode('A').reset_index(drop=True) # 仅保留每组第1行的B值,其余设为空 df_new['B'] = df_new['B'].where(df_new.index % 5 == 0, pd.NA)
内容的提问来源于stack exchange,提问作者Rachel Tumbleson
相关产品推荐
相关产品推荐

