python 连续比较_python – 确定连续日期

我有一个datetime.dates列表,我需要检查每个日期是否来自下个月.

希望很清楚我的代码是什么意思:

import datetime

from unittest import TestCase

def is_consecutive(dates):

# TODO

return

class DatesTestCase(TestCase):

def test_consecutive(self):

self.assertTrue(is_consecutive([datetime.date(2010, 10, 3),

datetime.date(2010, 11, 8),

datetime.date(2010, 12, 1),

datetime.date(2011, 01, 11)]))

def test_not_consecutive(self):

self.assertFalse(is_consecutive([datetime.date(2010, 7, 6),

datetime.date(2010, 8, 24),

datetime.date(2010, 3, 5),

datetime.date(2010, 10, 25)]))

self.assertFalse(is_consecutive([datetime.date(2010, 10, 6),

datetime.date(2010, 11, 2),

datetime.date(2010, 12, 9),

datetime.date(2010, 01, 20)]))

你将如何实现is_consecutive?

非常感谢任何帮助(建议,提示,代码或任何有用的)!

解决方法:

循环遍历列表中除最后一项之外的每个项目,并将其与下一项目进行比较.如果第二个月的月份恰好比第一个月的月份大一个,或者如果第二个月的月份是1而第二个月的年份恰好大于第一个月的年份,则两个项目是连续的.第一次失败时返回False,否则返回True.

编辑:在第二种情况下,显然第一个月必须是12,除了第二个月的1月.代码更新.

编辑2:在第一种情况下,显然年份应该是相同的.这就是你写得太快的原因.

F’rinstance:

#!/usr/bin/python

from datetime import date

def is_consecutive(datelist):

for idx, my_date in enumerate(datelist[:-1]):

if ((datelist[idx + 1].month - my_date.month == 1 and

datelist[idx + 1].year == my_date.year) or

(datelist[idx + 1].month == 1 and

my_date.month == 12 and

datelist[idx + 1].year - my_date.year == 1)):

continue

else:

return False

return True

print is_consecutive([date(2010, 10, 3),

date(2010, 11, 8),

date(2010, 12, 1),

date(2011, 1, 11)])

print is_consecutive([date(2010, 7, 6),

date(2010, 8, 24),

date(2010, 3, 5),

date(2010, 10, 25)])

另一种实现,可能更容易遵循,但基本上做同样的事情:

def is_consecutive(datelist):

for idx, my_date in enumerate(datelist[:-1]):

month_diff = datelist[idx + 1].month - my_date.month

year_diff = datelist[idx + 1].year - my_date.year

if ((month_diff == 1 and year_diff == 0) or

(month_diff == -11 and year_diff == 1)):

continue

else:

return False

return True

标签:python,datetime,python-2-x

来源: https://codeday.me/bug/20191007/1865145.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值