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

43

我正在使用Python创建一个模块,其中我收到以整数格式表示日期的数据,例如20120213,代表2012年2月13日。现在,我想将这个整数格式的日期转换为Python日期对象。

另外,如果有任何方法可以对这种整数格式的日期进行加减天数的操作,从而得到相同格式的日期值?比如从20120213减去30天,得到20120114

5个回答

49

这个问题已经有答案了,但是为了让其他查看该问题的人受益,我想添加以下建议:不要像接受的答案建议的那样自己做切片,您也可以使用strptime(),它更容易阅读,也许是进行此转换的首选方式。(IMHO)

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

1
如何创建一个由类似字符串/整数“20120203”组成的Pandas系列? - dejoma
5
df['order_date'] = df['order_date'].apply(lambda x: pd.to_datetime(str(x), format='%Y%m%d')) - 1dhiman
@1dhiman,这是我正在使用的格式,但我发现在大型数据集上仍然非常缓慢。有没有办法在pandas中进一步加速它? - iYOA

46
我建议采用以下简单方法进行转换:
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对象


1
但是我收到的不是一个字符串,而是一个整数。 - Uday0119
1
那很简单,你可以使用str(x)将整数转换为字符串。 - Peter
@peter:好的...谢谢你的建议。 - Uday0119
1
@Uday0119:我提供了一个建议,即使是小年份也可以正确地完成它。 - Jonas Schäfer
是的 @JonasWielicki... 谢谢你提供更新的信息... 这对我来说肯定是一个很大的帮助... - Uday0119

14

这是我认为回答问题的方法(使用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


我不知道这是如何运作的(我怀疑是黑魔法),但它非常有效!由于它是唯一一个真正回答了 OP 的问题,因此应该被接受为答案。 - Caltor

7
import datetime

timestamp = datetime.datetime.fromtimestamp(1500000000)

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

执行此命令会输出:

2017-07-14 08:10:00

非常感谢,这非常有用! - Karmavil

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

性能

在我的机器上,使用 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

(使用 CPython 3.11.2 和 Windows 10)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接