在 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.timedatetime.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 想要相反,从datedatetime 来自问题:相反的转换很简单: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)中将日期时间字符串转换为日期时间

如何在python中将字符串转换为日期时间[重复]

如何在python中将日期转换为纪元时间[重复]

如何在 python 中将 1970 年前的日期转换为纪元? [复制]

在python中将日期转换为列表

如何在 Python 中将日期转换为季度?