【问题标题】:Given a date in a specific format, how can I determine age in months?给定特定格式的日期,我如何确定以月为单位的年龄?
【发布时间】:2013-06-11 09:12:58
【问题描述】:

我有一个脚本,它以 2013 年 3 月 4 日的形式获取字符串。如何将其转换为可以用来确定日期年龄(以月为单位)的日期?我还希望能够将月份设为十进制形式(即 2.8 个月大)。

就编码而言,我完全不确定该怎么做。我读过不同的库可以做这样的事情,但我不确定哪个是最好的。

编辑:假设一个月有 30 天。这是我目前所拥有的:

import time
def ageinmonths( str )
    return time.today() - time.strptime("3/4/2013", "%b %d %y")

【问题讨论】:

  • 到目前为止你尝试过什么? datetime 模块是一个很好的起点。
  • 你如何定义一个月? 30 天还是按日历?如果某人在闰年的 2 月 28 日出生,他们会在两天后出生 0.0667 (1/29 + 1/31) 个月吗?
  • 这在很大程度上取决于您如何计算“1 个月”。 1个月=30天?是日历翻页的时候吗?
  • 我建议你使用 idle 或其他 Python shell 并输入诸如 time.today()time.strptime("3/4/2013", "%b %d %y") 之类的表达式并与它们一起玩,看看会发生什么。然后import datetime 并做dir(datetime)

标签: python datetime


【解决方案1】:

类似这样的:

>>> from datetime import datetime
>>> from dateutil.relativedelta import relativedelta
>>> dt = datetime.strptime('3/4/2013','%m/%d/%Y')
>>> r = relativedelta(datetime.now(), dt)
>>> months = r.years * 12 + r.months + r.days/30

【讨论】:

    【解决方案2】:

    编辑: 实现跨大西洋日期格式的终极和谐!

    import datetime,locale
    
    def transatlantic_age_in_months(datestring):
        datefmt = locale.nl_langinfo(locale.D_FMT)
        dob = datetime.datetime.strptime(datestring,datefmt[:-2]+'%Y')
        dt = dob.today() - dob
        return dt.days/30.
    

    【讨论】:

    • 编辑:这实际上比正确答案少了 1 个月。在“2013 年 3 月 4 日”的情况下,它给出 2.4 而不是 3.4
    • 我是英国人 :) 只需将 dd,mm,yy 更改为 mm,dd,yy
    • 知道了!我将您的答案与上面给出的答案结合使用。
    【解决方案3】:

    这是来自 kzh 的答案,但添加了发布者想要的小数。

    from datetime import datetime
    from dateutil.relativedelta import relativedelta
    
    date = '3/4/2013'
    
    dt = datetime.strptime(date,'%m/%d/%Y')
    r = relativedelta(datetime.now(), dt)
    months = r.years * 12 + r.months + r.days/30.
    print months
    >>>> 3.33333333333
    

    【讨论】:

    • 赞成您采纳我的答案并将其作为实际答案。大多数其他答案都不是pythonic。我见过的关于 Python 的最有价值的 cmets 之一来自我的一个老问题:“重写标准库提供的函数根本不是 Pythonic”。 stackoverflow.com/questions/1233539/…
    【解决方案4】:

    高级方法: 将您的日期转换为日期时间对象。调用 datetime.now()。减去。面条结果成几个月。

    【讨论】:

      【解决方案5】:

      我会使用 str.split('/'),​​然后以这种方式操作列表的每个索引。
      这种方式意味着您可以单独使用日/月/年来计算必要的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-02
        • 2015-09-16
        • 1970-01-01
        相关资源
        最近更新 更多