【问题标题】:How to get relevant month and date by inputting only the day of year in python如何通过仅在python中输入一年中的日期来获取相关的月份和日期
【发布时间】:2015-08-17 17:36:45
【问题描述】:

我正在从 python 开发一个电话簿应用程序作为一个迷你项目,我需要存储一个人的 NIC 号码,然后显示他/她的性别、出生日期和年龄。我必须导出这 3 个信息,并且我能够导出性别,但我不知道如何导出 DOB - 只有出生年份,因为 NIC 号码的前 2 位数字代表出生年份。

在 NIC 号码中,第三个三位数字是一年中的日期:- 从 001 到 366。我也可以将这三位数字分隔到另一个变量,但是我如何推导出它的月份和月份日期指的是什么?

例如:

derivedYear = 1996
dayOfYear = 032

finalDOB = "1996.02.01"
print finalDOB

我想知道如何计算 finalDOB 值。我正在使用 python 2.7.6

【问题讨论】:

    标签: python python-2.7 python-datetime


    【解决方案1】:

    您可以使用timedelta()。它可能需要几天作为参数,当添加到日期时,会将其移动该数量。

    import datetime
    
    year = 1996
    days = 32
    
    date = datetime.date(year, 1, 1) #Will give 1996-01-01
    delta = datetime.timedelta(days - 1) #str(delta) will be '31 days, 0:00:00'
    newdate = date + delta
    
    >>> str(newdate) 
    >>> 1996-02-01
    

    >>> newdate.strftime('%Y.%m.%d')
    >>> '1996.02.01'
    

    【讨论】:

    • 我收到此错误 - Traceback(最近一次调用最后一次):文件“test2.py”,第 4 行,在 中 date = datetime.datetime(year) TypeError: required argument 'month' (pos 2) 未找到
    • @PraveenFernando 抱歉,我忘了您需要在日期时间中给出月份和日期。刚刚更新了代码。再试一次:)
    • 是的,没关系...我试过了...你的方法给了我输出 1996-02-01 00:00:00 随着时间......谢谢你的帮助! :-)
    • @PraveenFernando 您可以将datetime.datetime(...) 更改为datetime.date(...),它将删除00:00:00 我已经更新了代码:)
    • 我明白了...非常感谢伙计! datetime.date() 也有效!
    【解决方案2】:

    您可以在datetime.datetime.strptime() 中使用%j 格式表示一年中的某一天,以获取对应的日期时间对象。示例 -

    >>> derivedYear = 1996
    >>> dayOfYear = 32
    >>> import datetime
    >>> d = datetime.datetime.strptime('{} {}'.format(dayOfYear, derivedYear),'%j %Y')
    >>> d
    datetime.datetime(1996, 2, 1, 0, 0)
    

    然后可以使用datetime对象的.day.month属性来获取对应的日月。示例 -

    >>> d.day
    1
    >>> d.month
    2
    

    如果您想要格式的结果 - YYYY.MM.DD - 您可以使用 strftime() 并为其提供格式。示例 -

    >>> d.strftime('%Y.%m.%d')
    '1996.02.01'
    

    另外,请注意,您不应使用前导 0 定义您的 dayOfYear,因为这会使文字成为八进制数,这不是您想要的。

    【讨论】:

    • 我遇到了另一个小问题...闰年的第 060 天是指 2 月 29 日。但在非闰年,060 指的是 3 月 1 日。根据 NIC 格式,无论闰年还是非闰年,他们都发布 366 天的数字。如果是非闰年,则不发布 060 并且 3 月 1 日由 061 表示,就像在闰年一样......但是我如何在我的 Python 程序中实现这一点?我尝试了 dayOfYear += 1,但它仍然在非闰年给出了 060 的 3 月 1 日的输出。
    • 您似乎理解错了,与其为闰年加 1,不如为非闰年减 1。在减去使用日期时间进行转换之后。
    猜你喜欢
    • 2023-03-10
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2020-06-02
    相关资源
    最近更新 更多