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


631

是否有一个内置的转换方法datedatetime在Python,例如获得datetime在指定日期的午夜?相反的转换很容易:datetime有一个.date()方法。

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


117
这不是一个愚蠢的问题;日期对象应该有一个.datetime()方法;愚蠢的是他们没有这种方法。
扎格斯

9
@Zags:或datetime.from_date()构造函数。
jfs 2015年

2
@DavidNemeskey:请阅读Zags的评论,我的评论对此进行了回复。这是关于应该存在哪些方法。
jfs 2015年

2
@JFSebastian:我不知道我是怎么想的...我完全同意。
大卫·尼梅斯基

7
不,日期不应该是日期时间的子集(甚至是名称中的日期)。从日期时间开始的日期是明确的。但是反过来说,日期通常是24小时,因此它可以有很多日期时间。日期是几号?您不能总是这样00:00,因为如果那个时间不存在怎么办,例如夏令时跳过了。不太容易#
dalore

Answers:


802

您可以使用datetime.combine(date, time);现在,您创建一个datetime.time初始化为午夜的对象。

from datetime import date
from datetime import datetime

dt = datetime.combine(date.today(), datetime.min.time())

79
谢谢。结合time()返回(0,0)的事实,我认为这是最干净的:datetime.combine(d, time())
EMP 2009年

33
请注意不要让您的代码将datetime.time()与time.time()混淆。合格的名字FTW!
达斯汀

8
是的,很好。幸运的是,如果您传入time.time或除以外的其他值,combin()会引发异常datetime.time
EMP

21
对于午夜,在datetime.time.min(2.7.1+)或datetime.min.time()(旧的python)中都有一个python常数
larham1 2011年

16
好的解决方案,但是我不认为datetime.min.time()是获取00:00:00时间的最干净方法。那是因为它要做的是首先检索日期时间可表示的最小值,然后获取其时间分量。顺便说一句,datetime.min = datetime(MINYEAR,1,1,tzinfo = None),时间为00:00:00。但是,我认为通过time.min或time(0,0,0,0)显式创建一个00:00:00时间更为干净。
Florin Dumitrescu 2013年

130

尽管我确实相信您提到(和不喜欢)的方法是最易读的方法,但是有几种方法。

>>> 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对象中适当地提取信息并将其犁入合适的ctor或classfunction中datetime


12
很好的一点。 datetime(d.year, d.month, d.day)确实比接受的答案更具可读性datetime.combine(d, datetime.min.time())
Simon Tewsi 2014年

2
@SimonTewsi: midnight = datetime.datetime.combine(d, datetime.time.min)看起来更干净(由@larham1建议)
jfs

2
@JF Sebastian:有点干净,但是我同意Wes Winham的回答,它要求读者知道datetime.time.min代表什么。而在我看来,这datetime(d.year, d.month, d.day)更明显(没有时间成分的日期时间)。不过,这只是次要点,即使读者不知道datetime.time.min代表什么,使用“ midnight”之类的变量名称也可以清楚地知道结果是什么。
西蒙·图西


76

可接受的答案是正确的,但我宁愿避免使用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,
)

这就是我对“明确胜于隐含”的看法。


还有一个向凯尔·吉布森(Kyle Gibson)提出最初想法的提示:stackoverflow.com/users/513197/kyle-gibson
Wes Winham 2014年

我同意你的观点。所有其他有关时间元组和星号以及min.time()的答案都需要研究,并且与Microsoft在VBA中轻松处理日期和日期时间相比,Python处理日期和日期时间的方式有点麻烦。只需将其包装为该语言的哈希符号即可。但是我离题了。
Bobort's

2
d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day)此答案的在线功能。
aliqandil'5

这可行,但是您可能需要datetime注意时区。在这种情况下,您可以import pytz然后添加tzinfo=pytz.timezone('Europe/London')
alstr

48

您可以使用date.timetuple()method和unpack运算符*

args = d.timetuple()[:6]
datetime.datetime(*args)

3
这对我的情况很有用。我不知道是通过日期还是日期时间,并且检查它是哪个类也不是很Python。此方法看起来对日期时间和日期对象均适用。
Gattster 2010年

datetime.combine通过@kiamlaluno的答案发现之前,我曾经使用过它。我认为这是相当Python的语言,尤其是考虑到构造一个datetime.time对象datetime.time(*map(int,"H:M:S".split(":")))无论如何都看起来很像……
Tom

1
这是我最喜欢的答案
Nam G VU

9

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

from datetime import date
import pandas as pd
d = date.today()
pd.Timestamp(d)

时间戳等于日期时间的大熊猫,并且在大多数情况下可以互换。校验:

from datetime import datetime
isinstance(pd.Timestamp(d), datetime)

但是,如果您真的想要一个普通的日期时间,您仍然可以执行以下操作:

pd.Timestamp(d).to_datetime()

时间戳比日期时间强大得多,尤其是在处理时区时。实际上,时间戳记是如此强大,以至于它们的文献记录如此之少,实在令人遗憾。


好决定。来到这里是因为我认为这将需要一个python datetime解决方案来解决熊猫的DatetimeIndex问题。羞耻的熊猫没有DateIndex的概念。
小鲍比表

5
为什么即使在2016年,我们也需要重量级的软件包才能进行日期时间操作?
Cowbert

带出大熊猫的这就像服用锤子的蚂蚁
德基小号

5

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

from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')

1
的确如此,但是将int转换为字符串并返回的方法可能比直接使用int更为昂贵,因此我只将其用于小批量处理
Egor Kraev


-10

如果您需要快速操作,请datetime_object.date()给您一个datetime对象的日期。


8
操作者希望相反,从date转到datetime
汤姆(Tom)

从这样一个问题:相反的转换很容易:datetime具有.date()方法。,大胆强调我的。
马丁·彼得斯

-13

我是Python的新手。但是这段代码对我有用,它将我提供的指定输入转换为datetime。这是代码。如我错了请纠正我。

import sys
from datetime import datetime
from 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

OP有一个datetime.date()对象,而不是string
马丁·彼得斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.