如何按id截取时间序列DataFrame的前15分钟数据?
按ID截取时间序列DataFrame的前15分钟数据
步骤1:转换时间列类型
首先要把字符串格式的timestamp列转为datetime类型,才能进行时间差计算:
import pandas as pd df = pd.DataFrame( {'id': [15,15,15,15,15,64,64,64,64,64], 'timestamp': ['2016-04-01 00:05:00','2016-04-01 00:10:20','2016-04-01 00:13:01', '2016-04-01 00:14:00','2016-04-01 00:16:00','2016-04-01 21:04:59', '2016-04-01 21:13:05','2016-04-01 21:20:00','2016-04-01 21:25:25', '2016-04-01 21:59:59']} ) # 转换为datetime类型 df['timestamp'] = pd.to_datetime(df['timestamp'])
步骤2:筛选每个ID的前15分钟数据
推荐两种实现方式:
方式一:使用transform(高效,适合大数据集)
通过transform计算每个ID的最早时间,直接筛选时间差≤15分钟的记录:
# 计算每个ID的起始时间 df['start_time'] = df.groupby('id')['timestamp'].transform('min') # 筛选起始时间后15分钟内的记录 new_df = df[df['timestamp'] <= df['start_time'] + pd.Timedelta(minutes=15)] # 清理辅助列并重置索引 new_df = new_df.drop(columns='start_time').reset_index(drop=True)
方式二:使用groupby+apply(直观,适合小数据集)
对每个ID分组后,单独筛选符合条件的行:
def filter_group(group): start = group['timestamp'].min() return group[group['timestamp'] <= start + pd.Timedelta(minutes=15)] new_df = df.groupby('id').apply(filter_group).reset_index(drop=True)
结果说明
运行后得到的new_df中,每个ID仅保留其最早时间点后15分钟内的记录。若需严格排除起始时间+15分钟整的记录,可将筛选条件中的<=改为<。
内容的提问来源于stack exchange,提问作者arilwan
相关产品推荐
相关产品推荐

