Как укоротить время на объекте DateTime в Python?

Что такое классный способ усечения объекта datetime python?

В этом конкретном случае, до дня. Таким образом, в основном установка часа, минуты, секунд и микросекунд на 0.

Я хотел бы, чтобы на выходе также был объект datetime, а не строка.

Ответ 1

Я думаю, это то, что вы ищете...

>>> 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)

Но если вы действительно не заботитесь о временном аспекте вещей, тогда вам действительно нужно только обойти объекты date...

>>> d_truncated = datetime.date(dt.year, dt.month, dt.day)
>>> d_truncated
datetime.date(2011, 3, 29)

Ответ 2

Используйте date не a datetime, если вы не заботитесь о времени.

>>> now = datetime.now()
>>> now.date()
datetime.date(2011, 3, 29)

Вы можете обновить дату и время, например:

>>> now.replace(minute=0, hour=0, second=0, microsecond=0)
datetime.datetime(2011, 3, 29, 0, 0)

Ответ 3

Четыре года спустя: другой способ, избегая replace

Я знаю, что принятый ответ от четырех лет назад работает, но это кажется чуть легче, чем использование replace:

dt = datetime.date.today()
dt = datetime.datetime(dt.year, dt.month, dt.day)

Примечания

  • Когда вы создаете объект datetime, не передавая свойства времени конструктору, вы получаете полночь.
  • Как отмечали другие, предполагается, что вам нужен объект datetime для последующего использования с timedeltas.
  • Вы можете, конечно, заменить это на первую строку: dt = datetime.datetime.now()

Ответ 4

Вы не можете усечь объект datetime, потому что он неизменен.

Тем не менее, есть один способ построить новое поле даты/времени с полями 0 час, минута, секунда и микросекунды, не выбрасывая исходную дату или tzinfo:

newdatetime = now.replace(hour=0, minute=0, second=0, microsecond=0)

Ответ 5

Чтобы получить полуночью, соответствующую заданному объекту datetime, вы можете использовать datetime.combine() method:

>>> 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)

Преимущество по сравнению с методом .replace() заключается в том, что решение на основе datetime.combine() будет продолжать работать, даже если datetime вводит поддержку наносекунд.

tzinfo может быть сохранен, если необходимо, но смещение utc может быть различным в полночь, например, из-за перехода DST, и поэтому наивное решение (установка tzinfo атрибута времени) может завершиться неудачей. См. Как получить время UTC в "полночь" для заданного часового пояса?

Ответ 6

Вы можете использовать панды для этого (хотя это может быть накладным расходом для этой задачи). Вы можете использовать round, floor и ceil, как для обычных чисел и любой частоты панд из смещенных псевдонимов:

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
"""

Ответ 7

Вы можете использовать datetime.strftime для извлечения дня, месяца, года...

Пример:

from datetime import datetime
d = datetime.today()

# Retrieves the day and the year
print d.strftime("%d-%Y")

Выход (на сегодня):

29-2011

Если вы просто хотите получить день, вы можете использовать атрибут дня, например:

from datetime import datetime
d = datetime.today()

# Retrieves the day
print d.day

Ouput (на сегодня):

29

Ответ 8

Для манипулирования датами есть большая библиотека: Delorean

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:

>>> d.truncate('year').datetime
datetime.datetime(2015, 1, 1, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>)

Ответ 9

Существует модуль datetime_truncate, который обрабатывает это для вас. Он просто вызывает datetime.replace.

Ответ 10

Вы можете использовать просто datetime.date.today(), чтобы он светился и возвращал то, что вы хотите

Ответ 11

6 лет спустя... Я нашел этот пост, и мне больше понравилось numpy aproach:

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]')

веселит

Ответ 12

Если вы имеете дело с Series типа DateTime, существует более эффективный способ их усекать, особенно если в объекте Series много строк.

Вы можете использовать функцию пола

Например, если вы хотите сократить его до часов:

Генерация диапазона дат

times = pd.Series(pd.date_range(start='1/1/2018 04:00:00', end='1/1/2018 22:00:00', freq='s'))

Мы можем проверить это, сравнивая время выполнения функций замены и пола.

%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)

Ответ 13

>>> import datetime
>>> dt = datetime.datetime.now()
>>> datetime.datetime.date(dt)
datetime.date(2019, 4, 2)