如果给定日期是当月的最后一天,我如何增加月份数?

How can I increment month number if given day is last day of current month?

我正在 Python 中构建天气预报网络抓取工具。我对日期有点问题。我在这样的列表中有几天的预测 [29,30,31,1,2,3]。我需要将其格式化为 2019-08-29 之类的日期格式,但如果是当月的最后一天,我不知道如何增加月份。

我尝试将当前月份加入到我的日子中,但如果我加入它,我将拥有该月的所有日期,例如: [2019-08-29, 2019-08-30, 2019-08-31,2019-08-01,2019-08-02,2019-08-03] 而不是 [2019-08-29, 2019-08-30, 2019-08-31,2019-09-01,2019-09-02,2019-09-03]

所以我需要你的帮助来检查循环,如果一天是当月的最后一天然后增加月份。

import pandas as pd
import datetime as dt
from calendar import monthrange

days = [29,30,31,1,2,3,4]
cy = int(dt.datetime.today().year)
cm = int(dt.datetime.today().month)
last_day = monthrange(cy,cm)[1]



for i,day in enumerate(days):
    while (days[i] - days[i+1]) == -1:
        i+=1
        print(cm)
    if (days[i] - days[i+1]) != -1:
        print(cm)
        cm += 1
    print(cm)

因此,如果您要做的只是使用一个增加月份的 for 循环,那么这应该可行:

days = [29, 30, 31, 1, 2, 3, 4]
cy = int(dt.datetime.today().year)
cm = int(dt.datetime.today().month)
last_day = monthrange(cy,cm)[1]

for i, day in enumerate(days):
    last_day = monthrange(cy, cm)[1]
    print(f"{cy}-{cm}-{day}")
    if cm == 12 and day == last_day:
        cy += 1
        cm = 1
    elif day == last_day:
        cm += 1

输出:

2019-8-29
2019-8-30
2019-8-31
2019-9-1
2019-9-2
2019-9-3
2019-9-4

虽然这种方法很容易出错,所以你需要添加错误处理。例如,如果当前月份是 11 月,而您得到的天数是 31,那么您将得到错误的下一次迭代日期 (2019-11-30, 2019-12-31, 2020-1-1)。这仅在 days 正确并且不会有任何错误的情况下有效。

像其他人建议的那样,预先进行一些预处理然后一起计算日期范围可能更安全。

使用内置日期时间模块

from datetime import date, timedelta
day0 = date.today()
for td in range(7):
    myday = day0 + timedelta(days=td)
    print(myday.strftime('%Y-%m-%d'))

输出

2019-08-30
2019-08-31
2019-09-01
2019-09-02
2019-09-03
2019-09-04
2019-09-05

两个使用第三方的替代方案pendulum,但您也可以使用任何其他流行的第三方软件包

import pendulum
d0 = pendulum.now()
dates = [d0.add(days=d).strftime('%Y-%m-%d') for d in range(7)]
print(dates)

start = pendulum.now()
end = start.add(days=6)
for d in pendulum.period(start, end):
    print(d.strftime('%Y-%m-%d'))

输出

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