Python生成未来12个月月初日期及DataFrame的问题求助
生成次月起始的未来12个月初日期并创建DataFrame
问题分析
第一次尝试的错误
循环中计算的next_month没有及时存入列表——append语句写在了循环外部,导致最终列表里只保留了最后一次循环的结果,前11个月份的日期都丢失了。
第二次尝试的错误
直接通过replace(month=xxx)修改月份时,没有处理跨年场景:当累加后的月份超过12时(比如当前是11月,累加3个月得到14月),就会触发ValueError: Month must be in 1..12,因为Python的datetime模块不允许月份超出1-12的合法范围。
修正方案
方案一:用relativedelta循环生成(兼容原生datetime)
import pandas as pd import datetime as dt from dateutil.relativedelta import relativedelta # 获取当前日期 today = dt.date.today() # 计算次月第一天:先取当月1号,加32天会自动跳到下月,再取1号 first_day_next_month = (today.replace(day=1) + dt.timedelta(days=32)).replace(day=1) # 生成未来12个月初的日期列表 first_day_next_12_months = [] for i in range(12): # 从次月开始,依次累加i个月,relativedelta自动处理跨年 current_month = first_day_next_month + relativedelta(months=i) first_day_next_12_months.append(current_month) # 创建DataFrame df = pd.DataFrame({"月初日期": first_day_next_12_months}) print(df)
方案二:用pandas date_range直接生成(更简洁高效)
如果已经在使用pandas,推荐用内置的时间序列生成工具,代码更简洁且不易出错:
import pandas as pd import datetime as dt today = dt.date.today() first_day_next_month = (today.replace(day=1) + dt.timedelta(days=32)).replace(day=1) # freq='MS'表示每月第一天(Month Start),periods指定生成12个日期 date_range = pd.date_range(start=first_day_next_month, periods=12, freq='MS') df = pd.DataFrame({"月初日期": date_range}) print(df)
内容的提问来源于stack exchange,提问作者Ty Kendall
相关产品推荐
相关产品推荐

