【问题标题】:ValueError: day is out of range for month datetimeValueError:日期超出月份日期时间的范围
【发布时间】:2017-07-29 03:30:49
【问题描述】:

我在编写一些代码时遇到了问题。我输入四个输入(日、月和年)作为日期,以及他们想要重复任务多少次的时间(例如,每周一,持续 3 周)。该代码很棒,但是如果几个月之间的周数不同,我会收到此错误:

  File "C:\Users\dansi\AppData\Local\Programs\Python\Python36-32\gui test 3.py", line 72, in addtimeslot
fulldateadd = datetime.date(year, month, day)
ValueError: day is out of range for month

相关的部分代码:

for i in range(0 , times):
    fulldateadd = datetime.date(year, month, day)
    cursor.execute( '''INSERT INTO dates (Date, Name, Start, End) VALUES( ?,?,?,? );''', (fulldateadd , name1, starttimehour, endtimehour))
    day = day + 7
    if day > 31:
        month = month + 1

当天数超过 31 天时,我尝试增加月份,但它似乎不起作用。

【问题讨论】:

  • 您不会在任何地方将天从零开始..
  • 这是一个重点。我将如何进行编码?我假设它找到了其余部分,但我不知道该怎么做。感谢回复
  • 在循环中增加一个带有 timedelta 的日期时间,而不是尝试在每次迭代时构造一个新的日期时间。
  • @Mitch 以前从未见过。我会看看,看看我是否可以使用它。谢谢。

标签: python python-3.x datetime


【解决方案1】:

增加一个日期时间的组件然后创建一个新的不是一个好主意有几个原因。主要是因为自己处理公历并不是那么令人愉快的恕我直言,而 datetime 对象可以为您完成。

关于这一点,更直接的方法是在循环中将 timedelta 添加到您的日期时间。例如,

>>> from datetime import timedelta
>>> times = 4
>>> cur_date = datetime.date(2017, 2, 24)

>>> for _ in range(times):
        print('today is {0}, do something'.format(cur_date))
        cur_date += timedelta(days=7)

today is 2017-02-24, do something
today is 2017-03-03, do something
today is 2017-03-10, do something
today is 2017-03-17, do something

这也可以放置在生成器中,具体取决于您的用例。

>>> for dt in (cur_date + timedelta(days=x*7) for x in range(times)):
        print('today is {0}, do something'.format(dt))

today is 2017-02-24, do something
today is 2017-03-03, do something
today is 2017-03-10, do something
today is 2017-03-17, do something

或与熊猫pd.date_range

>>> import pandas as pd
>>> list(pd.date_range(start='2017-02-24', periods=4, freq='7D'))

[Timestamp('2017-02-24 00:00:00', freq='7D'),
 Timestamp('2017-03-03 00:00:00', freq='7D'),
 Timestamp('2017-03-10 00:00:00', freq='7D'),
 Timestamp('2017-03-17 00:00:00', freq='7D')]

现在如果你用你的方法尝试这个例子会发生什么?

>>> year, month, day = 2017, 2, 24

>>> for i in range(0 , times):
        day = day
        fulldateadd = datetime.date(year, month, day)
        print('today is {0}, do something'.format(fulldateadd))
        day = day + 7
        if day > 31:
            day = day - 31
            month = month + 1

today is 2017-02-24, do something

ValueErrorTraceback (most recent call last)
<ipython-input-255-7df608ebbf8e> in <module>()
      1 for i in range(0 , times):
      2     day = day
----> 3     fulldateadd = datetime.date(year, month, day)
      4     print('today is {0}, do something'.format(fulldateadd))
      5     day = day + 7

ValueError: day is out of range for month

2 月没有 31 天...因此您必须包含一个映射到每个月的天数的支票。包括闰年的逻辑。

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多