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

时间:2019-08-30 15:32:54

标签: python datetime calendar

我正在用Python构建天气预报Web抓取工具。我在约会方面有一点问题。我在[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)

2 个答案:

答案 0 :(得分:0)

因此,如果您要尝试做的是使用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正确且没有任何错误的情况下才能使用。

像其他人建议的那样,事先进行一些预处理可能会比较安全,然后再计算整个日期范围。

答案 1 :(得分:0)

使用内置的datetime模块

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