我正在使用Python创建一个模块,其中我收到以整数格式表示日期的数据,例如20120213
,代表2012年2月13日。现在,我想将这个整数格式的日期转换为Python日期对象。
另外,如果有任何方法可以对这种整数格式的日期进行加减天数的操作,从而得到相同格式的日期值?比如从20120213
减去30天,得到20120114
?
我正在使用Python创建一个模块,其中我收到以整数格式表示日期的数据,例如20120213
,代表2012年2月13日。现在,我想将这个整数格式的日期转换为Python日期对象。
另外,如果有任何方法可以对这种整数格式的日期进行加减天数的操作,从而得到相同格式的日期值?比如从20120213
减去30天,得到20120114
?
这个问题已经有答案了,但是为了让其他查看该问题的人受益,我想添加以下建议:不要像接受的答案建议的那样自己做切片,您也可以使用strptime()
,它更容易阅读,也许是进行此转换的首选方式。(IMHO)
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)
这将确保你的字符串为八个字符长,并在左侧用零填充,即使年份小于1000(负数年份可能会变得有趣)。
更多参考:datetime对象,timedelta对象
这是我认为回答问题的方法(使用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
在我的机器上,使用 fromisoformat
方法比使用 datetime
类快约 60 倍,比使用 strptime
快约 7 倍。以下是代码:
从版本 3.11 开始更改:此方法以前仅支持格式 YYYY-MM-DD。
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
df['order_date'] = df['order_date'].apply(lambda x: pd.to_datetime(str(x), format='%Y%m%d'))
- 1dhiman