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

Python如何无需for循环获取pandas日期列对应每个月的最后一天

问题描述

现有2107260行、8列的数据集,需要将Date列的所有日期转换为对应月份的最后一天。

  • 原始数据快照:数据快照
  • 转换后预期效果:转换后效果

当前已有的for循环实现代码如下:

df2_1=pd.read_csv("C:\\Users\\Chirantan.Gupta\\Desktop\\Poland_Project\\V1_Data_SFS_2017_21.csv",low_memory=False)

import calendar
from datetime import timedelta
from datetime import date

df2_1['Date'] =  pd.to_datetime(df2_1['Date'], format='%Y-%d-%m')
df2_1['Date']= df2_1['Date'].dt.date

for i in range(df2_1.shape[0]):
    df2_1.iloc[i,6]=date(df2_1.iloc[i,6].year + (df2_1.iloc[i,6].month == 12), 
              (df2_1.iloc[i,6].month + 1 if df2_1.iloc[i,6].month < 12 else 1), 1) - timedelta(1)

该方案遍历200万行数据耗时过长,完全不可用,需要无for循环的高效实现方案。

高效解决方案

方案1:使用pandas内置MonthEnd偏移量(代码最简)

pandas内置的月份偏移工具直接支持向量化运算,代码仅需1行即可完成转换:

import pandas as pd

df2_1 = pd.read_csv("C:\\Users\\Chirantan.Gupta\\Desktop\\Poland_Project\\V1_Data_SFS_2017_21.csv", low_memory=False)
# 转换为datetime类型,保持原格式参数不变
df2_1['Date'] = pd.to_datetime(df2_1['Date'], format='%Y-%d-%m')
# 转换为当月最后一天,MonthEnd(0)保证当月月末日期不会偏移到下月
df2_1['Date'] = df2_1['Date'] + pd.offsets.MonthEnd(0)
# 若需要保留datetime.date格式,可增加下行,不需要可删除
df2_1['Date'] = df2_1['Date'].dt.date

方案2:手动向量化计算(兼容性更高)

如果不想依赖pandas的offset模块,也可以通过「下月初减1天」的逻辑向量化实现:

import pandas as pd
from datetime import timedelta

df2_1 = pd.read_csv("C:\\Users\\Chirantan.Gupta\\Desktop\\Poland_Project\\V1_Data_SFS_2017_21.csv", low_memory=False)
df2_1['Date'] = pd.to_datetime(df2_1['Date'], format='%Y-%d-%m')
# 先加1个月,取当月1号再减1天,得到当月最后一天
df2_1['Date'] = (df2_1['Date'] + pd.DateOffset(months=1)).dt.to_period('M').dt.to_timestamp() - timedelta(days=1)
# 转date格式按需添加
df2_1['Date'] = df2_1['Date'].dt.date

两种方案均为向量化运算,200万行数据的处理耗时仅需数秒,远快于原始for循环方案。

内容的提问来源于stack exchange,提问作者Saradamani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:30:02