【问题标题】:Parsing date string with year omitted解析省略年份的日期字符串
【发布时间】:2019-07-24 13:02:43
【问题描述】:

我得到了一系列格式为'July 24' 的日期字符串,即'%B %d'。我想解析这些字符串,使年份对应于最近的日期,所以如果今天是 2019 年 7 月 24 日,那么 'July 24' 应该被解析为 24/7/2019 但'July 25' 应该被解析为 25/7 /2018。我希望datetime 模块可以做到这一点,但它只是将年份设置为 1900。

>>> from datetime import datetime
>>> datetime.strptime('July 24', '%B %d')                                            
datetime.datetime(1900, 7, 24, 0, 0)

有没有比根据我的规则手动解析日期更简单的方法?

【问题讨论】:

  • 您可以将year 设置为datetime.datetime.now() 的年份。如果大于datetime.datetime.now(),则设置年份为datetime.datetime.now()'s year - 1
  • @Silveris 是的,这就是我手动解析日期的意思。我想在 datetime 模块中证明一个选项的合理性是不够的......

标签: python datetime


【解决方案1】:

可以在一行中完成,如果有更简单的方法,我不会感到惊讶:

from datetime import datetime

today = datetime.today()
before = datetime.strptime('July 24', '%B %d')
print(before.replace(year=today.year if before.replace(year=1) <= today.replace(year=1) else today.year - 1))
after = datetime.strptime('July 25', '%B %d')
print(after.replace(year=today.year if after.replace(year=1) <= today.replace(year=1) else today.year - 1))

输出

2019-07-24 00:00:00
2018-07-25 00:00:00

当然,这可以通过不调用两次before.replace(或after.replace)来进行微优化,但作为一个例子,这已经足够了。

【讨论】:

    【解决方案2】:

    想到这个问题的一件事是datetime.datetime'year' 作为它的第一个位置参数,这是创建它的实际实例所必需的。因此,如果您将类 datetime.dateime 导入为 datetime 并引用它的方法而不首先删除它的实例,那么您将依赖于 datetime.datetime.year 等属性的默认值。

    这是一个函数,它接受一个字符串mydate,其格式为"%B %d",并返回一个datetime 实例,其year 属性设置为2019(但保持月份和日期相同)如果 datetime.datetime.today().month == datetime.datetime.strptime(mydate, "%B %d").monthdatetime.datetime.today().day == datetime.datetime.strptime(mydate, "%B %d").day,或者在任何其他情况下将其 year 属性设置为 2018。

    您可以调用strftime("%Y/%B/%d") 来获取该字符串以在您的更大程序中进一步执行,或将其添加到此定义中。

    import datetime
    
    def make_year_float(mydate):
    
        dt = datetime.datetime
    
        d1 = dt.today().month, dt.today().day
    
        the_date = dt.strptime(mydate, "%B %d")
        d2 = the_date.month, the_date.day
    
        if d1 == d2:
            return dt(2019, the_date.month, the_date.day)
        elif d1 != d2:
            return dt(2018, the_date.month, the_date.day)
    
    

    【讨论】:

      猜你喜欢
      • 2012-03-04
      • 2012-07-14
      • 2012-11-18
      • 2018-08-16
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多