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
相关产品推荐
相关产品推荐

