如何用Pandas移除DataFrame中每日的首个分钟数据?
我来帮你搞定这个需求——要移除每个日期首个分钟内的所有记录,我们可以利用Pandas的datetime处理和分组功能轻松实现,具体步骤和代码如下:
1. 先确保索引是datetime类型
首先得把你的quote_ts索引转换成datetime格式,这样才能方便后续的时间操作:
import pandas as pd # 你的原始数据 df = pd.DataFrame({ 'quote_ts': ['2020-05-15 14:01:00.522517', '2020-05-15 14:01:00.599999', '2020-05-15 15:00:01.234517', '2020-05-16 14:00:00.312518', '2020-05-16 14:01:00.582517', '2020-05-17 14:00:00.122983', '2020-05-17 14:02:00.524567', '2020-05-18 14:00:00.522517'], 'price': [1000, 1200, 1300, 1000, 1400, 1800, 1900, 1600] }) df = df.set_index('quote_ts') # 转换索引为datetime类型 df.index = pd.to_datetime(df.index)
2. 标记并过滤首个分钟的记录
接下来,我们要为每个日期找到它的首个分钟区间,然后过滤掉该区间内的所有行:
# 给每条记录生成精确到分钟的时间标识 df['minute'] = df.index.floor('min') # 用transform给每个日期组添加"当日首个分钟"的标记 df['first_min_of_day'] = df.groupby(df.index.date)['minute'].transform('min') # 筛选出不属于当日首个分钟的记录,同时删除中间列 result_df = df[df['minute'] != df['first_min_of_day']].drop(['minute', 'first_min_of_day'], axis=1)
看看结果是否符合预期
运行完上面的代码后,result_df就会和你想要的完全一致:
>>> result_df price quote_ts 2020-05-15 15:00:01.234517 1300 2020-05-16 14:01:00.582517 1400 2020-05-17 14:02:00.524567 1900
更简洁的写法(不用中间列)
如果你不想创建额外的中间列,也可以用groupby.filter一步到位:
result_df = df.groupby(df.index.date).filter( lambda group: group.index.floor('min') != group.index.floor('min').min() )
这个逻辑是对每个日期分组,只保留那些时间的分钟区间不等于该组最早分钟区间的行,结果和上面完全一样。
内容的提问来源于stack exchange,提问作者Dario Federici
相关产品推荐
相关产品推荐

