You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Pandas时间序列DataFrame提取月末最近行至新DataFrame

提取时间序列DataFrame中每月最接近月末的行

这个需求在量化分析或日常数据整理里挺常见的,用pandas可以实现完全动态的解决方案——不用依赖固定行索引,完美适配DataFrame内容变化的场景,具体步骤如下:

1. 确保日期列是datetime类型

首先得保证你的Date列是pandas的datetime格式,不然没法做后续的时间计算。如果还没转换,执行这行:

import pandas as pd

dfMain['Date'] = pd.to_datetime(dfMain['Date'])

要是Date已经是datetime类型,这步可以直接跳过。

2. 计算每个日期到当月月末的天数差

我们需要先拿到每个日期对应的当月最后一天,再计算该日期与月末的天数差(取绝对值,因为不管是月末前还是月末后,只要最接近就行):

# 生成每个日期对应的当月月末日期
dfMain['month_end'] = dfMain['Date'] + pd.offsets.MonthEnd(0)
# 计算日期与月末的天数差(绝对值)
dfMain['days_to_end'] = (dfMain['month_end'] - dfMain['Date']).dt.days.abs()

3. 按月份分组,筛选最接近月末的行

接下来按「年份+月份」分组,在每组里找到days_to_end最小的那一行(也就是离月末最近的行):

# 分组后获取每组天数差最小的行的索引
closest_indices = dfMain.groupby([dfMain['Date'].dt.year, dfMain['Date'].dt.month])['days_to_end'].idxmin()
# 根据索引提取目标行,同时删掉临时生成的辅助列
result_df = dfMain.loc[closest_indices].drop(columns=['month_end', 'days_to_end'])

额外说明

  • 如果你的Date列是DataFrame的索引(而非普通列),只需要把代码里的dfMain['Date']替换成dfMain.index即可。
  • 要是某月份里有两行离月末的天数完全相同(比如一个在月末前1天,一个在月末后1天),idxmin()会返回组内第一个出现的那一行,你可以根据需求调整逻辑(比如取后一个,或者全部保留)。

内容的提问来源于stack exchange,提问作者lee.edward01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:18:22