【问题标题】:python efficient way to validate datepython验证日期的有效方法
【发布时间】:2018-04-10 09:11:45
【问题描述】:

我有一个日期为 %m%d%Y 格式的大文件,即 2013 年 1 月 12 日的 12012013。

我必须做两件事:

1) 验证日期
2) 将其存储在按时间顺序排列的列表中

用于验证:

        try:
            parsedDate = datetime.strptime(date, '%m%d%Y')
            return parsedDate
        except:
            return None'

使用 DateTime 需要花费大量时间来解析日期。由于格式是 mmddyyyy,我可以在不有效使用 datetime 的情况下验证它吗?

2) 对于时间顺序:我不想将其转换为日期时间然后对其进行排序,有没有办法可以使用字符串对其进行排序。我检查了很多答案,但几乎所有答案都假设您有一个列表,然后对其进行排序。

我想以排序格式插入它?

【问题讨论】:

  • 您想将验证日期作为字符串还是日期时间对象返回?如果不需要转换,只需拆分字符串并进行整数边界检查。
  • 我本来打算做同样的事情,但是我必须考虑闰年的情况,一个月中的天数是 31,30 的情况以及我想避免的所有其他变化。此外,我还想对日期进行排序
  • 你怎么知道是日期时间让你慢了下来?

标签: python validation datetime


【解决方案1】:
  1. datetime 模块非常好,如果您想要任何其他选项,您可以验证为 reg 表达式,请检查:match dates using python regular expressions

  2. 对日期进行排序而不转换为日期时间。只需将其转换为 yyyymmdd 格式,然后进行字符串排序或创建一个空列表,然后根据更大或更小的值将字符串附加到正确的位置。

希望您自己尝试一下:)

【讨论】:

  • 排序到 yyyymmdd 应该可以工作。感谢那!。我会检查正则表达式部分!
【解决方案2】:

如果格式是%m%d%Y,最有效的是使用正则表达式(有一些关于此的分析)。

例如:

import re
import datetime

match_date = re.compile(r'(\d{2})(\d{2})(\d{4})$').match

text = '12012013'
mo = match_date(text)

if mo:
    date = datetime.date(int(mo.group(3)), int(mo.group(1)), int(mo.group(2)))
    print(date)
    # -> 2013-12-01

这样,RegEx 将执行第一级过滤,date 构造函数执行第二级过滤(有一个例外)。当然,你可以改进你的 RegEx,这对于演示来说是微不足道的。

如果您提前知道您的日期都是有效的,您可以避免转换为date 并使用tuple(年、月、日)进行排序,而不是使用date

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多