在Python中,是否有内置方法可以将date
转换为datetime
,例如获取给定日期午夜的datetime
?相反的转换很容易: datetime
有一个.date()
方法。
我真的必须手动调用datetime(d.year, d.month, d.day)
吗?
datetime.combine(date, time)
来实现;对于时间,你需要创建一个初始化为午夜的 datetime.time
对象。from datetime import date
from datetime import datetime
dt = datetime.combine(date.today(), datetime.min.time())
datetime.combine(d, time())
。 - EMPdatetime.time
而是time.time
或其他类型数据,combine()函数会引发一个异常。 - EMP有几种方法,虽然我相信你提到的那个(并且不喜欢的)是最易读的。
>>> import datetime
>>> t=datetime.date.today()
>>> datetime.datetime.fromordinal(t.toordinal())
datetime.datetime(2009, 12, 20, 0, 0)
>>> datetime.datetime(t.year, t.month, t.day)
datetime.datetime(2009, 12, 20, 0, 0)
>>> datetime.datetime(*t.timetuple()[:-4])
datetime.datetime(2009, 12, 20, 0, 0)
等等其他操作——但基本上它们都依赖于从date
对象中适当提取信息,并将其重新插入到适合datetime
的构造函数或类函数中。
datetime(d.year, d.month, d.day)
确实比被接受的答案 datetime.combine(d, datetime.min.time())
更易读。 - Simon Elmsmidnight = datetime.datetime.combine(d, datetime.time.min)
看起来更简洁。(建议来自 @
larham1) - jfsdatetime(d.year, d.month, d.day)
更明显(一个没有时间组件的日期时间)。虽然这只是一个小问题,但使用像“midnight”这样的变量名使得结果很明显,即使读者不知道datetime.time.min
代表什么。 - Simon Elmsdatetime.datetime(*(getattr(d,attr)for attr in(“year”,“month”,“day”)))
。这样,您可以轻松修改对您重要的属性列表。例如,可以动态添加小时。 - Guimouted = d.replace(hour=0, minute=0, second=0, microsecond=0)
这种方法也是可行的,但我不喜欢这种方式,因为它强制你必须知道所有关键字并手动将它们设置为0。对于4个参数来说,这种方法可以工作,但如果有12个参数,我们就会开始质疑这种方法的可行性。 - Guimoute被采纳的答案是正确的,但我更喜欢避免使用datetime.min.time()
,因为对我来说不太明显它具体做了什么。如果您觉得很明显,那么就更好了。我对timetuple
方法和依赖于排序也有同样的感觉。
在我看来,最可读、最明确的方法是不依赖于读者非常熟悉datetime
模块 API:
from datetime import date, datetime
today = date.today()
today_with_time = datetime(
year=today.year,
month=today.month,
day=today.day,
)
这是我的看法,“明确胜于隐晦”。
d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day)
是这个答案中的一行函数。 - aliqandildatetime
,那么你可以 import pytz
,然后添加 tzinfo=pytz.timezone('Europe/London')
,例如。 - alstrdate.timetuple()
方法和解包运算符*
。args = d.timetuple()[:6]
datetime.datetime(*args)
datetime.combine
通过@kiamlaluno的回答之前,我曾经使用过这个。我认为它相当符合Python风格,特别是构造一个datetime.time
对象可能看起来像datetime.time(*map(int, "H:M:S".split(":")))
. - Tomdt.datetime(*(dt.datetime.utcnow().timetuple()[:2] + (1, )))
。 - Thomas Browne今天是2016年,我认为最干净的解决方案由pandas Timestamp提供:
from datetime import date
import pandas as pd
d = date.today()
pd.Timestamp(d)
Timestamp是pandas中与datetime等价且在大多数情况下可以互换的类型。请检查:
from datetime import datetime
isinstance(pd.Timestamp(d), datetime)
但是如果你真的想要一个普通的日期时间,你仍然可以这样做:
pd.Timestamp(d).to_datetime()
相较于日期时间,在处理时区等方面,时间戳更加强大。事实上,时间戳非常强大,可惜的是它们的文档记录很差...
to_datetime()
已被弃用,请使用to_pydatetime()
代替。对于那些已经因为某种原因必须使用Pandas并且需要日期时间格式的人来说,这是一个好答案。 - NumesSanguis你也可以使用
date = datetime.utcnow().date()
dt = datetime.fromisoformat(date.isoformat())
print(dt)
datetime.datetime(2021, 11, 15, 0, 0)
日期时间:2021年11月15日,0时0分
datetime.fromisoformat(date.isoformat() + ' 17:32')
。 - Georg Pfolz一种将日期转换为日期时间的方法尚未提及:
from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')
我真的需要手动调用datetime(d.year, d.month, d.day)吗?
不必这样,您可以直接调用:
date_to_datetime(dt)
您可以在项目中的utils/time.py
中实现一次,
from typing import Optional
from datetime import date, datetime
def date_to_datetime(
dt: date,
hour: Optional[int] = 0,
minute: Optional[int] = 0,
second: Optional[int] = 0) -> datetime:
return datetime(dt.year, dt.month, dt.day, hour, minute, second)
一个替代 toisoformat
/fromisoformat
的方法:你可以使用 date.toordinal
和 datetime.fromordinal
:
import datetime
start_date = datetime.date(1991, 2, 20)
start_date_midnight = datetime.datetime.fromordinal(start_date.toordinal())
我认为这比将其转换为/从字符串进行更有效率。
你可以这样测试这个过程:
def test_datetime_from_date():
for x in range(1,1000000):
date_ = datetime.date.fromordinal(x)
datetime_ = datetime.datetime.fromordinal(date_.toordinal())
datetime_iso_date, t, datetime_iso_time = datetime_.isoformat().partition("T")
assert datetime_iso_date == date_.isoformat()
.datetime()
方法,而愚蠢的是它们没有这样的方法。 - Zagsdatetime.from_date()
构造函数。 - jfs