规则日期被一周抵消

时间:2019-01-20 12:46:53

标签: python-dateutil rrule

使用python-dateutil rrule模块得到了意外的结果,我想知道这是否是WAI。

我正在使用以下方法动态创建rrule

dtstart = datetime.date(2019, 1, 7)
until = datetime.date(2029, 11, 29)
freq = MONTHLY
byweekday=MO(2)
interval = 4

这导致以下规则

DTSTART:20190107T000000
RRULE:FREQ=MONTHLY;INTERVAL=4;UNTIL=20291129T000000;BYDAY=+2MO

但是,当生成日期时(在此python模块的规则中循环),我得到以下日期:

 [datetime.datetime(2019, 1, 14, 0, 0),
 datetime.datetime(2019, 5, 13, 0, 0),
 datetime.datetime(2019, 9, 9, 0, 0),
 datetime.datetime(2020, 1, 13, 0, 0),
 datetime.datetime(2020, 5, 11, 0, 0),
 datetime.datetime(2020, 9, 14, 0, 0),
 datetime.datetime(2021, 1, 11, 0, 0),
 datetime.datetime(2021, 5, 10, 0, 0),
 datetime.datetime(2021, 9, 13, 0, 0),
 datetime.datetime(2022, 1, 10, 0, 0),
 datetime.datetime(2022, 5, 9, 0, 0),
 datetime.datetime(2022, 9, 12, 0, 0),
 datetime.datetime(2023, 1, 9, 0, 0),
 datetime.datetime(2023, 5, 8, 0, 0),
 datetime.datetime(2023, 9, 11, 0, 0),
 datetime.datetime(2024, 1, 8, 0, 0),
 datetime.datetime(2024, 5, 13, 0, 0),
 datetime.datetime(2024, 9, 9, 0, 0),
 datetime.datetime(2025, 1, 13, 0, 0),
 datetime.datetime(2025, 5, 12, 0, 0),
 datetime.datetime(2025, 9, 8, 0, 0),
 datetime.datetime(2026, 1, 12, 0, 0),
 datetime.datetime(2026, 5, 11, 0, 0),
 datetime.datetime(2026, 9, 14, 0, 0),
 datetime.datetime(2027, 1, 11, 0, 0),
 datetime.datetime(2027, 5, 10, 0, 0),
 datetime.datetime(2027, 9, 13, 0, 0),
 datetime.datetime(2028, 1, 10, 0, 0),
 datetime.datetime(2028, 5, 8, 0, 0),
 datetime.datetime(2028, 9, 11, 0, 0),
 datetime.datetime(2029, 1, 8, 0, 0),
 datetime.datetime(2029, 5, 14, 0, 0),
 datetime.datetime(2029, 9, 10, 0, 0)]

请注意,第一个日期偏移了一周!为什么会这样呢?这是库中的错误吗?

谢谢, 大卫

2 个答案:

答案 0 :(得分:0)

这不是库中的错误。 2019-01-14是符合您的规则的第一个日期(这是2019年1月的第二个星期一)。显然python-dateutil选择不包含您提供的开始日期,这完全合法。

RRULERFC 5545中指定,在Section 3.8.5.3中(在“描述”下)指出:

  

使用“ DTSTART”属性生成的重复设置   与重复规则不同步的值是不确定的。

从本质上讲,这意味着没有正确或错误的解释,因为如果开始日期与规则不匹配,则输入数据将被“破坏”。

请注意,许多其他实现可能会同时返回您的开始日期2019-01-07 结果2019-01-14。我认为任何实现都不会省略2019-01-14,仅仅是因为它是第一个与规则匹配的日期。在结果中是否应该包含开始日期2019-01-07还是有争议的,但是肯定应该在其中包含2019-01-14

答案 1 :(得分:0)

在 Python 中 by_weekly 代码可以这样实现。

path = os.path.join(raw_folder, folder, file)
print('[DEBUG] path:', path)

img = cv2.imread(path)

if img is None:
    print('Wrong path:', path)
else:
    img = cv2.resize(img, dsize=(128,128))
    pixels.append(img)