How to truncate the time on a DateTime object in Python?
什么是截断python datetime对象的优雅方法?
在这种特殊情况下,到了今天。 所以基本上将小时,分钟,秒和微秒设置为0。
我希望输出也是一个日期时间对象,而不是一个字符串。
我想这就是你要找的......
1 2 3 4 5 | >>> 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) |
但是,如果你真的不关心事物的时间方面,那么你应该只是传递
1 2 3 | >>> d_truncated = datetime.date(dt.year, dt.month, dt.day) >>> d_truncated datetime.date(2011, 3, 29) |
如果您不关心时间,请使用
1 2 3 | >>> now = datetime.now() >>> now.date() datetime.date(2011, 3, 29) |
您可以像这样更新日期时间:
1 2 | >>> now.replace(minute=0, hour=0, second=0, microsecond=0) datetime.datetime(2011, 3, 29, 0, 0) |
四年后:另一种方式,避免
我知道四年前接受的答案是有效的,但这似乎比使用
1 2 | dt = datetime.date.today() dt = datetime.datetime(dt.year, dt.month, dt.day) |
笔记
-
当您创建
datetime 对象而不将时间属性传递给构造函数时,您将获得午夜。 - 正如其他人所指出的那样,这假设您需要一个datetime对象以供以后与timedeltas一起使用。
-
当然,您可以将其替换为第一行:
dt = datetime.datetime.now()
您不能截断日期时间对象,因为它是不可变的。
但是,这是一种构建具有0小时,分钟,秒和微秒字段的新日期时间的方法,而不会丢弃原始日期或tzinfo:
1 | newdatetime = now.replace(hour=0, minute=0, second=0, microsecond=0) |
要获得与给定日期时间对象相对应的午夜,您可以使用
1 2 3 4 5 6 | >>> 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) |
与
如果需要,可以保留
您可以使用pandas(虽然它可能是该任务的开销)。你可以使用圆形,地板和ceil,就像通常的数字和任何来自偏移别名的pandas频率一样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 """ |
您可以使用datetime.strftime来提取日期,月份,年份......
示例:
1 2 3 4 5 | from datetime import datetime d = datetime.today() # Retrieves the day and the year print d.strftime("%d-%Y") |
输出(今天):
1 | 29-2011 |
如果您只想检索当天,可以使用day属性,例如:
1 2 3 4 5 | from datetime import datetime d = datetime.today() # Retrieves the day print d.day |
输出(今天):
1 | 29 |
有一个伟大的图书馆用于操纵日期:Delorean
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import datetime from delorean import Delorean now = datetime.datetime.now() d = Delorean(now, timezone='US/Pacific) >>> now datetime.datetime(2015, 3, 26, 19, 46, 40, 525703) >>> d.truncate('second') Delorean(datetime=2015-03-26 19:46:40-07:00, timezone=US/Pacific) >>> d.truncate('minute') Delorean(datetime=2015-03-26 19:46:00-07:00, timezone=US/Pacific) >>> d.truncate('hour') Delorean(datetime=2015-03-26 19:00:00-07:00, timezone=US/Pacific) >>> d.truncate('day') Delorean(datetime=2015-03-26 00:00:00-07:00, timezone=US/Pacific) >>> d.truncate('month') Delorean(datetime=2015-03-01 00:00:00-07:00, timezone=US/Pacific) >>> d.truncate('year') Delorean(datetime=2015-01-01 00:00:00-07:00, timezone=US/Pacific) |
如果你想获得datetime值:
1 2 | >>> d.truncate('year').datetime datetime.datetime(2015, 1, 1, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>) |
你可以使用datetime.date.today()它很轻,并返回你想要的exaclty
有一个模块datetime_truncate,它可以为您处理。它只是调用datetime.replace。
1 2 3 4 | >>> import datetime >>> dt = datetime.datetime.now() >>> datetime.datetime.date(dt) datetime.date(2019, 4, 2) |
如果您正在处理一系列类型的DateTime,则有一种更有效的方法来截断它们,特别是当Series对象有很多行时。
您可以使用楼层功能
例如,如果要将其截断为小时:
生成一系列日期
1 | times = pd.Series(pd.date_range(start='1/1/2018 04:00:00', end='1/1/2018 22:00:00', freq='s')) |
我们可以检查它比较替换和地板功能之间的运行时间。
1 2 3 4 5 | %timeit times.apply(lambda x : x.replace(minute=0, second=0, microsecond=0)) >>> 341 ms ± 18.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) %timeit times.dt.floor('h') >>>>2.26 ms ± 451 μs per loop (mean ± std. dev. of 7 runs, 100 loops each) |
6年后......我找到了这篇文章,我更喜欢那个numpy aproach:
1 2 3 | import numpy as np dates_array = np.array(['2013-01-01', '2013-01-15', '2013-01-30']).astype('datetime64[ns]') truncated_dates = dates_array.astype('datetime64[D]') |
干杯
截断是什么意思?
您可以使用strftime()方法并使用适当的格式字符串完全控制格式。
http://docs.python.org/library/datetime.html#strftime-strptime-behavior