我在 python 中创建一个模块,我在其中接收整数格式的日期,如
20120213
,表示 2012 年 2 月 13 日。现在,我想将这个整数格式的日期转换为 python 日期对象。
此外,是否有任何方法可以减去/添加此类整数格式日期中的天数以接收相同格式的日期值?比如从
20120213
中减去 30 天并得到答案 20120114
?
This question is already answered,但为了其他人看这个问题的利益,我想添加以下建议:与其按照接受的答案中的建议自己进行切片,您还可以使用
strptime()
which是(恕我直言)更容易阅读,也许是进行这种转换的首选方式。
import datetime
s = "20120213"
s_datetime = datetime.datetime.strptime(s, '%Y%m%d')
我建议使用以下简单的转换方法:
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(负年份可能会变得有趣)。
我认为这是问题的答案(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
.
import datetime
timestamp = datetime.datetime.fromtimestamp(1500000000)
print(timestamp.strftime('%Y-%m-%d %H:%M:%S'))
这将给出输出:
2017-07-14 08:10:00
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)