如何在Python中截断DateTime对象的时间?

Kyl*_*ndt 225 python datetime

什么是截断python datetime对象的优雅方法?

在这种特殊情况下,到了今天.所以基本上将小时,分钟,秒和微秒设置为0.

我希望输出也是一个日期时间对象,而不是一个字符串.

Chr*_* W. 339

我想这就是你要找的......

>>> import datetime
>>> dt = datetime.datetime.now()
>>> dt = dt.replace(hour=0, minute=0, second=0, microsecond=0) # Returns a copy
>>> dt
datetime.datetime(2011, 3, 29, 0, 0)
Run Code Online (Sandbox Code Playgroud)

但如果你真的不关心事物的时间方面,那么你应该真的只是绕过date物体......

>>> d_truncated = datetime.date(dt.year, dt.month, dt.day)
>>> d_truncated
datetime.date(2011, 3, 29)
Run Code Online (Sandbox Code Playgroud)

  • 使用时区感知dt,datetime.datetime(dt.year,dt.month,dt.day)会抛弃tzinfo信息. (13认同)
  • 请注意,python 2和python 3 [docs](https://docs.python.org/3.4/library/datetime.html#datetime.datetime.replace)都声明`replace()`方法_returns_是一个datetime对象,所以正确的咒语是:`dt = datetime.datetime.now().replace(小时= 0,分钟= 0,秒= 0,微秒= 0) (4认同)
  • OP需要`datetime`,而不是`date`对象(你可以使用`dt.date()`调用(不需要使用显式构造函数)).如果[`datetime`添加纳秒支持](http://bugs.python.org/issue15443),`.replace()`方法可能会失败.你可以[使用`datetime.combine()`代替](http://stackoverflow.com/a/28311227/4279). (3认同)
  • 如果你只是在寻找今天,你也可以做 datetime.date.today() (2认同)

Joc*_*zel 56

如果你不关心时间,请使用date不是a datetime.

>>> now = datetime.now()
>>> now.date()
datetime.date(2011, 3, 29)
Run Code Online (Sandbox Code Playgroud)

您可以像这样更新日期时间:

>>> now.replace(minute=0, hour=0, second=0, microsecond=0)
datetime.datetime(2011, 3, 29, 0, 0)
Run Code Online (Sandbox Code Playgroud)

  • 使用时区感知日期时,now.date()会抛弃tzinfo信息. (9认同)
  • 请注意,[将其转换回日期时间](/sf/ask/135633571/)有点痛苦。 (2认同)

zx8*_*x81 27

四年后:另一种方式,避免 replace

我知道四年前所接受的答案是有效的,但这似乎比使用时更轻松replace:

dt = datetime.date.today()
dt = datetime.datetime(dt.year, dt.month, dt.day)
Run Code Online (Sandbox Code Playgroud)

笔记

  • 当你创建一个datetime没有将时间属性传递给构造函数的对象时,你会得到午夜.
  • 正如其他人所指出的那样,这假设您需要一个datetime对象以供以后与timedeltas一起使用.
  • 当然,您可以将其替换为第一行: dt = datetime.datetime.now()

  • 使用时区感知日期时间,tzinfo 信息不会在两者之间共享。 (2认同)

ʇsә*_*ɹoɈ 20

您不能截断日期时间对象,因为它是不可变的.

但是,这是一种构建具有0小时,分钟,秒和微秒字段的新日期时间的方法,而不会丢弃原始日期或tzinfo:

newdatetime = now.replace(hour=0, minute=0, second=0, microsecond=0)
Run Code Online (Sandbox Code Playgroud)


jfs*_*jfs 13

要获得与给定日期时间对象相对应的午夜,您可以使用datetime.combine()方法:

>>> from datetime import datetime, time
>>> dt = datetime.utcnow()
>>> dt.date()
datetime.date(2015, 2, 3)
>>> datetime.combine(dt, time.min)
datetime.datetime(2015, 2, 3, 0, 0)
Run Code Online (Sandbox Code Playgroud)

.replace()方法相比的优点是datetime.combine()即使datetime模块引入了纳秒支持,基于解决方案也将继续工作.

tzinfo如果需要可以保留但是utc偏移可以在午夜不同,例如,由于DST转换,因此天真的解决方案(设置tzinfo时间属性)可能失败.请参阅如何为给定时区获取"午夜"的UTC时间?


Ant*_*pov 7

您可以使用pandas(虽然它可能是该任务的开销).你可以使用圆形,地板ceil,就像通常的数字和任何来自偏移别名的 pandas频率一样:

import pandas as pd
import datetime as dt

now = dt.datetime.now()
pd_now = pd.Timestamp(now)

freq = '1d'
pd_round = pd_now.round(freq)
dt_round = pd_round.to_pydatetime()

print(now)
print(dt_round)

"""
2018-06-15 09:33:44.102292
2018-06-15 00:00:00
"""
Run Code Online (Sandbox Code Playgroud)


小智 7

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.dt.floor.html查看更多

现在是 2019 年,我认为最有效的方法是:

df['truncate_date'] = df['timestamp'].dt.floor('d')
Run Code Online (Sandbox Code Playgroud)