在 Python 中将日期转换为日期时间
Posted
技术标签:
【中文标题】在 Python 中将日期转换为日期时间【英文标题】:Convert date to datetime in Python 【发布时间】:2010-12-28 14:24:40 【问题描述】:是否有在 Python 中将date
转换为datetime
的内置方法,例如在给定日期的午夜获取datetime
?相反的转换很容易:datetime
有一个.date()
方法。
我真的需要手动调用datetime(d.year, d.month, d.day)
吗?
【问题讨论】:
不是一个愚蠢的问题;日期对象应该有一个.datetime()
方法;愚蠢的是他们没有这样的方法。
@Zags: 或 datetime.from_date()
构造函数。
不,日期不应该是日期时间的子集(它甚至在名称中)。日期时间的日期是明确的。但反过来,一个日期是 24 小时的一个块(通常),所以它可以有很多日期时间。什么日期时间会来自一个日期?你不能总是这样 00:00 因为如果那个时间不存在怎么办,例如夏令时跳过它。没那么容易#
@Dalore 夏令时是在凌晨 1 点到凌晨 2 点之间,以避免出现您所描述的问题。
@zags 这一切都取决于时区源和目的地,您可以在凌晨 1 点更改夏令时,但这将对应于其他时区的午夜更改。如果你正在编程你使用哪个时区?你很可能最终试图获得一个不存在的时间。我的观点仍然存在,为日期添加时间并不是直截了当的。然后你还必须考虑你的新日期时间是否也知道时区或天真。
【参考方案1】:
您可以使用datetime.combine(date, time)
;目前,您创建了一个初始化为午夜的 datetime.time
对象。
from datetime import date
from datetime import datetime
dt = datetime.combine(date.today(), datetime.min.time())
【讨论】:
谢谢。结合 time() 返回 (0,0) 的事实,我认为这是最干净的:datetime.combine(d, time())
请注意不要让您的代码将 datetime.time() 与 time.time() 混淆。限定名称 FTW!
是的,好点。幸运的是,如果您传入 time.time
或 datetime.time
以外的任何其他内容,combine() 会引发异常。
对于午夜,在 datetime.time.min (2.7.1+) 或 datetime.min.time() (旧版 python) 处有一个 python 常量
很好的解决方案,但我不认为 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 时间更简洁。【参考方案2】:
有几种方法,虽然我相信你提到(和不喜欢)的那一种是最易读的。
>>> 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 或类函数中。
【讨论】:
非常好。datetime(d.year, d.month, d.day)
确实比公认的答案 datetime.combine(d, datetime.min.time())
更具可读性。
@SimonTewsi: midnight = datetime.datetime.combine(d, datetime.time.min)
看起来更干净(@
larham1 建议)
@J. F. Sebastian:它更简洁一些,但我同意 Wes Winham 的回答,即它要求读者知道 datetime.time.min 代表什么。而在我看来datetime(d.year, d.month, d.day)
更明显(没有时间组件的日期时间)。不过,这是一个小问题,使用像“midnight”这样的变量名可以让结果很明显,即使读者不知道datetime.time.min
代表什么。
@SimonTewsi:注意:datetime(d.year, d.mont, d.day)
is not only more obvious, it is faster too.【参考方案3】:
接受的答案是正确的,但我宁愿避免使用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) 致敬:***.com/users/513197/kyle-gibson 我同意你的观点。所有这些带有 timetuple 和星号以及 min.time() 的其他答案都需要研究,并且与 Microsoft 在 VBA 中处理它们的简便性相比,Python 处理日期和日期时间的方式无论如何都有些麻烦。它就像用该语言将它们包装在哈希符号中一样简单。但我离题了。d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day)
这个答案的在线功能。
这行得通,但您可能需要datetime
来识别时区。在这种情况下,您可以import pytz
,然后添加tzinfo=pytz.timezone('Europe/London')
,例如。【参考方案4】:
您可以使用date.timetuple()
方法和解包运算符*
。
args = d.timetuple()[:6]
datetime.datetime(*args)
【讨论】:
这对我的情况很有用。我不知道我被传递的是一个日期还是一个日期时间,而且检查它是哪个类并不是很pythonic。此方法看起来适用于 datetime 和 date 对象。 在通过@kiamlaluno 的回答发现datetime.combine
之前,我曾经使用过这个。我认为它相当 Pythonic,特别是考虑到构造一个 datetime.time
对象可能看起来像 datetime.time(*map(int,"H:M:S".split(":")))
反正......
这是我最喜欢的答案
在许多其他情况下也很有用,例如通过索引低至 [:3] 来截断秒、分钟或小时,如果你用 + (n,) 填充,则甚至更低:@ 987654327@【参考方案5】:
今天是 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()
在处理时区时,时间戳比日期时间强大得多。实际上,时间戳是如此强大,可惜它们的文档记录如此糟糕......
【讨论】:
好电话。来到这里,因为我认为它需要一个 python datetime 解决方案来解决 pandas DatetimeIndex 问题。可惜 pandas 没有 DateIndex 的概念。 为什么我们需要一个重量级的包来进行日期时间操作,即使是在 2016 年?! 为此带出熊猫就像拿锤子打蚂蚁 使用 pandas 来解决这个问题是大材小用【参考方案6】:一种尚未提及的从日期转换为日期时间的方法:
from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')
【讨论】:
是的,但是将 int 转换为字符串并返回可能比直接使用 int 更昂贵,所以我只会将这个用于低容量处理【参考方案7】:您可以使用easy_date 来简化:
import date_converter
my_datetime = date_converter.date_to_datetime(my_date)
【讨论】:
【参考方案8】:我真的需要手动调用 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)
【讨论】:
【参考方案9】:你也可以使用
date = datetime.utcnow().date()
dt = datetime.fromisoformat(date.isoformat())
print(dt)
datetime.datetime(2021, 11, 15, 0, 0)
【讨论】:
您甚至可以通过这种方式将时间添加为字符串:datetime.fromisoformat(date.isoformat() + ' 17:32')
【参考方案10】:
你可以使用这个类:
import time
import datetime
class TimingClass():
def __init__(self):
self.YEAR = datetime.date.today().year
self.MONTH = datetime.date.today().month
self.DATE = datetime.date.today().day
self.HOUR = datetime.datetime.now().hour
self.MINUTE = datetime.datetime.now().minute
self.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())
【讨论】:
【参考方案11】:如果你需要一些快速的东西,datetime_object.date()
会给你一个日期时间对象的日期。
【讨论】:
op 想要相反,从date
到datetime
。
来自问题:相反的转换很简单:datetime
有一个.date()
方法。,我的粗体强调。【参考方案12】:
我是 Python 的新手。但是这段代码对我有用,它将我提供的指定输入转换为日期时间。这是代码。如果我错了,请纠正我。
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()
对象,不是字符串。以上是关于在 Python 中将日期转换为日期时间的主要内容,如果未能解决你的问题,请参考以下文章
在numpy(python)中将日期时间字符串转换为日期时间