如何将时间戳外推至10分钟粒度并按规则回填var1字段
实现步骤与代码
1. 数据预处理
先把原始数据的timestamp转换为datetime类型,再计算每个记录对应的有效填充窗口(原始时间点前3小时到该时间点):
import pandas as pd # 原始数据 data = { 'timestamp': ['2020-07-05 10:32:00', '2020-07-05 18:22:00', '2020-07-05 22:30:00', '2020-07-06 09:13:00'], 'var1': [2, 8, 6, 5] } df1 = pd.DataFrame(data) # 转换timestamp为datetime类型 df1['timestamp'] = pd.to_datetime(df1['timestamp']) # 计算每个记录的填充窗口:前3小时到当前时间点 df1['window_start'] = df1['timestamp'] - pd.Timedelta(hours=3) df1['window_end'] = df1['timestamp']
2. 生成10分钟间隔的时间序列
基于所有有效窗口的时间范围,生成连续的10分钟刻度时间序列:
# 确定时间范围边界,对齐到10分钟刻度 start_time = df1['window_start'].min().floor('10min') end_time = df1['window_end'].max().ceil('10min') # 生成10分钟间隔的时间序列 time_range = pd.date_range(start=start_time, end=end_time, freq='10T') result_df = pd.DataFrame({'timestamp': time_range})
3. 匹配窗口并填充数值
用merge_asof高效匹配每个时间点对应的有效窗口,超出窗口的时间点标记为N/A:
# 排序以满足merge_asof的要求 df1_sorted = df1.sort_values('window_start') result_df_sorted = result_df.sort_values('timestamp') # 按时间匹配最近的窗口起始点 merged = pd.merge_asof( result_df_sorted, df1_sorted[['window_start', 'window_end', 'var1']], left_on='timestamp', right_on='window_start', direction='backward' ) # 过滤掉超出窗口结束时间的记录,设置为N/A merged['var1'] = merged.apply( lambda row: row['var1'] if row['timestamp'] <= row['window_end'] else 'N/A', axis=1 ) # 整理最终结果 final_df = merged[['timestamp', 'var1']].sort_values('timestamp').reset_index(drop=True)
结果说明
运行后final_df完全符合需求:
- 时间点按10分钟间隔连续排列
- 原始记录对应的前3小时窗口内填充对应
var1值 - 窗口外的时间点显示
N/A
内容的提问来源于stack exchange,提问作者prof31
相关产品推荐
相关产品推荐

