如何将整数转换为日期对象python?

问题描述 投票:0回答:5

我在 python 中创建一个模块,我在其中接收整数格式的日期,如

20120213
,表示 2012 年 2 月 13 日。现在,我想将这个整数格式的日期转换为 python 日期对象。

此外,是否有任何方法可以减去/添加此类整数格式日期中的天数以接收相同格式的日期值?比如从

20120213
中减去 30 天并得到答案
20120114
?

python python-2.7 date python-datetime strptime
5个回答
46
投票

This question is already answered,但为了其他人看这个问题的利益,我想添加以下建议:与其按照接受的答案中的建议自己进行切片,您还可以使用

strptime()
which是(恕我直言)更容易阅读,也许是进行这种转换的首选方式。

import datetime
s = "20120213"
s_datetime = datetime.datetime.strptime(s, '%Y%m%d')

45
投票

我建议使用以下简单的转换方法:

from datetime import datetime, timedelta
s = "20120213"
# you could also import date instead of datetime and use that.
date = datetime(year=int(s[0:4]), month=int(s[4:6]), day=int(s[6:8]))

要添加/减去任意数量的天数(顺便说一句,秒也可以),您可以执行以下操作:

date += timedelta(days=10)
date -= timedelta(days=5)

并转换回来使用:

s = date.strftime("%Y%m%d")

要安全地将整数转换为字符串,请使用:

s = "{0:-08d}".format(i)

这确保您的字符串长度为 8 个字符,并用零填充左侧,即使年份小于 1000(负年份可能会变得有趣)。

进一步参考:datetime objects, timedelta objects


13
投票

我认为这是问题的答案(Python 3,带有类型提示):

from datetime import date


def int2date(argdate: int) -> date:
    """
    If you have date as an integer, use this method to obtain a datetime.date object.

    Parameters
    ----------
    argdate : int
      Date as a regular integer value (example: 20160618)

    Returns
    -------
    dateandtime.date
      A date object which corresponds to the given value `argdate`.
    """
    year = int(argdate / 10000)
    month = int((argdate % 10000) / 100)
    day = int(argdate % 100)

    return date(year, month, day)


print(int2date(20160618))

上面的代码产生预期的

2016-06-18
.


6
投票
import datetime

timestamp = datetime.datetime.fromtimestamp(1500000000)

print(timestamp.strftime('%Y-%m-%d %H:%M:%S'))

这将给出输出:

2017-07-14 08:10:00

0
投票

在 Python 3.11+ 中,可以使用

date.fromisoformat
为此目的:

from datetime import date, timedelta

integer_date = 20120213
date_object = date.fromisoformat(f'{integer_date}')
print(f'{date_object - timedelta(30):%Y%m%d}')  # prints 20120114

3.11版本改动:之前该方法只支持YYYY-MM-DD格式

性能

我机器上的 timeit 显示

fromisoformat
比使用
datetime
类快大约 60 倍,比
strptime
快大约 7 倍。这是代码:

import datetime as dt
from timeit import timeit


strptime = dt.datetime.strptime
fromisoformat = dt.datetime.fromisoformat
datetime = dt.datetime

s = "20120213"
assert datetime(int(s[0:4]), int(s[4:6]), int(s[6:8])) == fromisoformat(s) == strptime(s, '%Y%m%d')

strptime_time = timeit('strptime(s, "%Y%m%d")', globals=globals())
fromisoformat_time = timeit('fromisoformat(s)', globals=globals())
datetime_time = timeit('datetime(int(s[0:4]), int(s[4:6]), int(s[6:8]))', globals=globals())

print(f'{strptime_time/fromisoformat_time=}')
print(f'{datetime_time/fromisoformat_time=}')

结果:

strptime_time/fromisoformat_time=60.46678219698884
datetime_time/fromisoformat_time=7.008299761426674

(使用 CPython 3.11.2 和 Windows 10)

© www.soinside.com 2019 - 2024. All rights reserved.