咨询:为油井数据库生成自首次投产起的月份计数列最优方案
解决方案:生成油井投产以来的月份计数列
针对你的需求,最合适的方案是基于日期计算分组内的月份间隔,具体步骤如下:
构建可计算的日期列
先将year和month转换为标准日期对象(取当月第一天),方便后续计算月份差:df['date'] = pd.to_datetime(df[['year', 'month']].assign(day=1))分组计算投产月份计数
按油井id分组,计算每条记录的日期与该油井首次投产日期的月份间隔,最后加1(让首次投产月计数为1):df['month_count_calc'] = df.groupby('id')['date'].transform( lambda x: (x.dt.year - x.min().dt.year)*12 + (x.dt.month - x.min().dt.month) + 1 )
完整验证代码
import pandas as pd data = { 'id' : ['A','A','A','A','B','B','C','C','C','C','C'], 'year' : [2022,2022,2022,2022,2022,2022,2022,2022,2022,2022,2022], 'month' : [6,7,8,9,8,9,5,6,7,8,9], 'month_count' : [1,2,3,4,1,2,1,2,3,4,5], } df = pd.DataFrame(data) # 生成日期列 df['date'] = pd.to_datetime(df[['year', 'month']].assign(day=1)) # 计算month_count df['month_count_calc'] = df.groupby('id')['date'].transform( lambda x: (x.dt.year - x.min().dt.year)*12 + (x.dt.month - x.min().dt.month) + 1 ) # 验证结果与目标一致 print(df[['id', 'year', 'month', 'month_count', 'month_count_calc']])
方案优势
- 支持跨年度计算:即使油井投产跨年度(比如2022年12月到2023年1月),也能准确计算为第2个月
- 逐行生成结果:不是聚合类输出,完全满足你需要每个自然月对应计数值的需求
- 逻辑清晰:直接基于日期差计算,避免手动处理月份排序可能出现的错误
内容的提问来源于stack exchange,提问作者Esteban Maito
相关产品推荐
相关产品推荐

