在Python中比较日期字符串

12
>> a ='2009-05-10'
>>> b ='2009-06-10'
>>> a > b
False
>>> a < b
True
>>> type(a)
<class 'str'>
>>> c = '2009-06-09'
>>> b < c
False
>>> b > c
True
>>> c ='2008-07'
>>> b > c
True
>>> a > c
True
我尝试在Python3中比较日期,而不使用库,看起来它正常工作了。这是真的吗?Python是否真的理解这些字符串是日期,并根据日期格式进行比较,还是其他事情正在幕后发生?

4
如果您选择一个合理的日期格式,标准的字典序排列字符串会像它知道它们是日期一样工作;然而,实际上并非如此。 - jonrsharpe
如果Python只是分析您的字符串内容以确定它们表示什么,那么为什么它会有一个内置的datetime模块呢? - Two-Bit Alchemist
好的,现在事情清楚了。谢谢。 - SpiderRico
1
这就是为什么ISO 8601使用YYYYMMDD并让字典排序来处理其余部分的原因。日期不会被解析或验证。 - dawg
是的,这是ISO-8601(YYYY-MM-DD)https://developers.facebook.com/docs/marketing-api/dynamic-product-ads/product-catalog。 - RajSharma
这也是为什么DICOM使用格式“YYMMDD-YYMMDD”,您只需拆分“-”并进行>和<的比较即可。 - Alberto Perez
1个回答

17
不,这种行为背后没有特别之处。事实上,Python按字典顺序比较字符串,在这种情况下可以工作,但这不是正确的方法,因为它也可能接受错误的日期!
这里有一个反例:
>>> a ='2009-33-10'
>>> b ='2009-11-1'
>>> a>b
True

作为处理日期的正确方式,您应该使用datetime模块,该模块具有许多用于处理日期对象的工具。
您可以使用datetime.datetime.strptime将字符串转换为日期对象,然后可以使用基本算术运算来比较日期对象,因为这些操作已经被该模块支持。

enter image description here


2
@Kasramvd,你的解释没有问题。然而,当日期时间字符串被统一格式化(这样你的例子就不适用了)并且是直接从日期时间对象格式化的情况下,Python3中直接进行日期时间字符串比较实际上是一个很好的优点! - Devy
@Devy 实际上,在那种情况下你是可以这样做的。但是,基本上最好不要这样做(因为通常不能保证始终接收到一致的格式),除非它能给你带来显著的性能改变。 - Mazdak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接