如果给定日期是当月的最后一天,我如何增加月份数?
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
我正在 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