在Python中将日期转换为日期时间

EMP*_*EMP 571 python datetime date

是否有内置的方法在Python 中将a转换date为a datetime,例如获取datetime给定日期的午夜?相反的转换很简单:datetime有一个.date()方法.

我真的要手动打电话datetime(d.year, d.month, d.day)吗?

kia*_*uno 724

您可以使用datetime.combine(日期,时间); 在那个时候,你创建一个datetime.time初始化为午夜的对象.

from datetime import date
from datetime import datetime

dt = datetime.combine(date.today(), datetime.min.time())
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.结合time()返回(0,0)的事实,我认为这是最干净的:`datetime.combine(d,time())` (70认同)
  • 注意不要让你的代码让datetime.time()与time.time()混淆.合格的名字FTW! (30认同)
  • 午夜时分,在datetime.time.min(2.7.1+)或datetime.min.time()(较旧的python)中有一个python常量 (20认同)
  • 很好的解决方案,但我不认为datetime.min.time()是获得00:00:00时间最干净的方法.这是因为它所做的是首先检索由datetime表示的最小值,然后获取其时间组件.顺便提一下,datetime.min = datetime(MINYEAR,1,1,tzinfo = None)并且时间为00:00:00.但是,我认为通过time.min或time(0,0,0,0)显式创建00:00:00时间会更清晰. (14认同)
  • 是的,好点.幸运的是,如果传入`time.time`或除了'datetime.time`以外的任何其他内容,combine()会引发异常. (7认同)
  • @EMP,我添加了一个使用该技术的示例。让我们希望它被接受。 (2认同)
  • @ el.atomo因为实际的*问题*今天没有明确要求 (2认同)

Ale*_*lli 119

有几种方法,虽然我确实相信你提到的(并且不喜欢)是最可读的方式.

>>> 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)
Run Code Online (Sandbox Code Playgroud)

等等 - 但基本上它们都依赖于从date物体中适当地提取信息并将其犁回到合适的ctor或类功能中datetime.

  • 很好的一点.`datetime(d.year,d.month,d.day)`看起来比接受的答案`datetime.combine(d,datetime.min.time())`更具可读性. (12认同)
  • @SimonTewsi:注意:[`datetime(d.year,d.mont,d.day)`不仅更明显,它也更快](http://stackoverflow.com/a/33276464/4279). (4认同)
  • @SimonTewsi:`midnight = datetime.datetime.combine(d,datetime.time.min)`看起来更干净(由[`@` larham1]建议(http://stackoverflow.com/questions/1937622/convert-date-to -datetime式的Python#comment7273463_1937636)) (2认同)
  • @JF Sebastian:虽然有点干净,但我同意Wes Winham的回答,它要求读者知道datetime.time.min代表什么.而在我看来,'datetime(d.year,d.month,d.day)`更明显(没有时间组件的日期时间).这是一个小问题,并且使用像"午夜"这样的变量名称,即使读者不知道`datetime.time.min`代表什么,结果也很明显. (2认同)

Wes*_*ham 64

接受的答案是正确的,但我宁愿避免使用,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,
)
Run Code Online (Sandbox Code Playgroud)

这是我对"明确比隐含更好"的看法.

  • ```d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day)``` 这个答案的在线函数。 (2认同)
  • 这可行,但您可能需要“日期时间”来了解时区。在这种情况下,您可以“导入 pytz”,然后添加“tzinfo=pytz.timezone('Europe/London')”,例如。 (2认同)

tee*_*ark 42

您可以使用date.timetuple()方法和解压缩运算符*.

args = d.timetuple()[:6]
datetime.datetime(*args)
Run Code Online (Sandbox Code Playgroud)

  • 这对我的情况很有用.我不知道这是一个约会,也不是我正在通过的约会时间,检查哪个班级并不是非常pythonic.此方法看起来适用于datetime和date对象. (2认同)
  • 这是我最喜欢的答案 (2认同)

NON*_*ONO 11

你也可以使用

date = datetime.utcnow().date()
dt = datetime.fromisoformat(date.isoformat())

print(dt)
Run Code Online (Sandbox Code Playgroud)

日期时间. 日期时间(2021, 11, 15, 0, 0)

  • 您甚至可以通过以下方式将时间添加为字符串:`datetime.fromisoformat(date.isoformat() + ' 17:32')` (2认同)

kad*_*dee 9

今天是2016年,我认为最干净的解决方案是由pandas Timestamp提供的:

from datetime import date
import pandas as pd
d = date.today()
pd.Timestamp(d)
Run Code Online (Sandbox Code Playgroud)

时间戳是大熊猫相当于日期时间,并且在大多数情况下可以与它互换.校验:

from datetime import datetime
isinstance(pd.Timestamp(d), datetime)
Run Code Online (Sandbox Code Playgroud)

但如果你真的想要一个香草日期时间,你仍然可以:

pd.Timestamp(d).to_datetime()
Run Code Online (Sandbox Code Playgroud)

时间戳比日期时间更强大,其中包括处理时区时.实际上,时间戳是如此强大,以至于它们的记录如此糟糕......

  • 为什么我们需要一个重量级的包来进行日期时间操作,即使是在 2016 年?! (19认同)
  • 为此带出熊猫就像拿锤子打蚂蚁一样 (4认同)

kad*_*dee 7

一种尚未提及的从日期转换为日期时间的方法:

from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是将整数转换为字符串并返回可能比直接使用整数要昂贵得多,所以我只将它用于小批量处理 (2认同)

Rap*_*edo 5

您可以使用easy_date来简化此操作:

import date_converter
my_datetime = date_converter.date_to_datetime(my_date)
Run Code Online (Sandbox Code Playgroud)