Как укоротить время на объекте DateTime в Python? - PullRequest
208 голосов
/ 29 марта 2011

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

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

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

Ответы [ 14 ]

317 голосов
/ 29 марта 2011

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

>>> 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)
51 голосов
/ 29 марта 2011

Используйте date, а не 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)
25 голосов
/ 01 августа 2015

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

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

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

Примечания

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

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

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

newdatetime = now.replace(hour=0, minute=0, second=0, microsecond=0)
12 голосов
/ 04 февраля 2015

Чтобы получить полночь, соответствующую данному объекту даты и времени, вы можете использовать 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)

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

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

7 голосов
/ 15 июня 2018

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

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
"""
4 голосов
/ 29 марта 2011

Вы можете использовать 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
3 голосов
/ 27 марта 2015

Для манипулирования датами есть большая библиотека: 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>)
1 голос
/ 07 января 2019

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

1 голос
/ 01 октября 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...