在Python中是否有将date转换为datetime的内置方法,例如在给定日期的午夜获取datetime?相反的转换很容易:datetime有.date()方法。
date
datetime
.date()
我真的需要手动调用datetime(d.year, d.month, d.day)吗?
datetime(d.year, d.month, d.day)
有几种方法,虽然我相信你提到的(和不喜欢的)是最可读的。
>>> 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的合适ctor或类函数中。
您可以使用date.timetuple()方法和解包运算符*。
date.timetuple()
*
args = d.timetuple()[:6]datetime.datetime(*args)
您可以使用datetime.combine(date, time);,因为您创建了一个初始化为午夜的datetime.time对象。
datetime.combine(date, time)
datetime.time
from datetime import datefrom datetime import datetime dt = datetime.combine(date.today(), datetime.min.time())
如果你需要一些快速的东西,datetime_object.date()会给你一个日期时间对象的日期。
datetime_object.date()
我是Python的新手。但是这段代码对我很有效,它将我提供的指定输入转换为datetime。这是代码。如果我错了,请纠正我。
import sysfrom datetime import datetimefrom time import mktime, strptime user_date = '02/15/1989'if user_date is not None:user_date = datetime.strptime(user_date,"%m/%d/%Y")else:user_date = datetime.now()print user_date
公认的答案是正确的,但我更倾向于避免使用datetime.min.time(),因为它的确切作用对我来说并不明显。如果你很明显,那么你就有更多的力量。我对timetuple方法和对顺序的依赖也有同样的感觉。
datetime.min.time()
timetuple
在我看来,在不依赖读者非常熟悉datetime模块API的情况下,最可读、最明确的方法是:
from datetime import date, datetimetoday = date.today()today_with_time = datetime(year=today.year,month=today.month,day=today.day,)
这就是我对“显式比隐式更好”的看法。
一种从date转换为datetime的方法还没有提到:
from datetime import date, datetimed = date.today()datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')
您可以使用easy_date使其更容易:
import date_convertermy_datetime = date_converter.date_to_datetime(my_date)
今天是2016年,我认为熊猫时间戳提供了最干净的解决方案:
from datetime import dateimport pandas as pdd = date.today()pd.Timestamp(d)
时间戳相当于datetime,在大多数情况下可以与它互换。检查:
from datetime import datetimeisinstance(pd.Timestamp(d), datetime)
但如果你真的想要一个香草日期时间,你仍然可以这样做:
pd.Timestamp(d).to_datetime()
在处理时区时,时间戳比日期时间强大得多。实际上,时间戳是如此强大,以至于遗憾的是它们的记录如此之少…
我真的必须手动调用datetime(d.year,d.month,d.day)
不,你宁愿打电话
date_to_datetime(dt)
您可以在项目中的一些utils/time.py中实现一次:
utils/time.py
from typing import Optionalfrom 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)
你可以使用这个类:
import time import datetime class TimingClass(): def __init__(self): self.YEAR = datetime.date.today().yearself.MONTH = datetime.date.today().monthself.DATE = datetime.date.today().dayself.HOUR = datetime.datetime.now().hourself.MINUTE = datetime.datetime.now().minuteself.SECONDS = datetime.datetime.now().second self.TODAY = datetime.date.today()self.YESTERDAY = datetime.datetime.strftime( (self.TODAY - datetime.timedelta(days = 1)) , '%Y-%m-%d')self.TOMORROW = datetime.datetime.strftime( (self.TODAY + datetime.timedelta(days = 1)) , '%Y-%m-%d') self.TODAY_datetime = datetime.datetime.combine(datetime.date.today(), datetime.datetime.min.time())
您还可以使用
date = datetime.utcnow().date()dt = datetime.fromisoformat(date.isoformat()) print(dt)
datetime.datetime(2021,11,15,0,0)
要使dt时区感知datetime(使用Django时区util):
dt
from django.utils import timezone timezone.now().replace(*(*dt.timetuple()[:6], 0))
toisoformat/fromisoformat的替代方法:您可以使用date.toordinal和datetime.fromordinal:
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()