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

Python天气预报爬虫跨月日期格式化问题求助

解决天气预报爬虫中的日期跨月处理问题

嘿,我明白你在处理跨月日期时的困扰——手动判断当月最后一天再调整月份确实容易踩坑,咱们来捋清楚怎么解决这个问题。

首先得说,你原来的代码逻辑有点绕,靠相邻日期差值判断的方式不仅容易出现索引越界(比如循环到最后一个元素时,days[i+1]就不存在了),而且没法把调整后的月份正确应用到后续日期上。其实不用这么麻烦,Python的datetime模块本身就能帮我们自动处理日期的跨月/跨年变化,完全不用手动判断当月最后一天!

方法一:用datetime自动递推日期(最省心的方式)

我们可以从列表的第一个日期开始,依次往后加一天,datetime会自动帮我们处理月份甚至年份的递增,代码简洁又可靠:

import datetime as dt

days = [29, 30, 31, 1, 2, 3, 4]
today = dt.datetime.today()
current_year = today.year
current_month = today.month

# 初始化第一个日期的完整datetime对象
start_date = dt.date(current_year, current_month, days[0])
formatted_dates = []

# 遍历列表,依次递推日期
for idx, _ in enumerate(days):
    target_date = start_date + dt.timedelta(days=idx)
    formatted_dates.append(target_date.strftime("%Y-%m-%d"))

print(formatted_dates)

运行后你会得到期望的结果:

['2019-08-29', '2019-08-30', '2019-08-31', '2019-09-01', '2019-09-02', '2019-09-03', '2019-09-04']

方法二:手动判断调整月份(保留你的思路)

如果你更倾向于手动处理月份逻辑,那可以通过对比当前日期和前一个日期的大小来判断是否跨月,同时记得处理跨年的情况:

import datetime as dt

days = [29, 30, 31, 1, 2, 3, 4]
current_year = dt.datetime.today().year
current_month = dt.datetime.today().month
formatted_dates = []

prev_day = None
for day in days:
    # 当当前日期比前一天小,说明进入下一个月
    if prev_day is not None and day < prev_day:
        current_month += 1
        # 处理跨年:12月之后切换到1月,年份加1
        if current_month > 12:
            current_month = 1
            current_year += 1
    # 格式化日期,确保月份和日期是两位数
    formatted_date = f"{current_year}-{current_month:02d}-{day:02d}"
    formatted_dates.append(formatted_date)
    prev_day = day

print(formatted_dates)

原代码的问题出在哪?

你原来的循环里用while跳过连续日期的逻辑会打乱索引顺序,而且最后一个元素访问days[i+1]会直接抛出索引错误。另外,你只在发现日期不连续时才加月份,但没有把更新后的月份同步到后续的日期处理中,导致后面的日期还是用原来的月份,自然得不到正确结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:07:48