Что такое классный способ усечения объекта datetime python?
В этом конкретном случае, до дня. Таким образом, в основном установка часа, минуты, секунд и микросекунд на 0.
Я хотел бы, чтобы на выходе также был объект datetime, а не строка.
Что такое классный способ усечения объекта datetime python?
В этом конкретном случае, до дня. Таким образом, в основном установка часа, минуты, секунд и микросекунд на 0.
Я хотел бы, чтобы на выходе также был объект datetime, а не строка.
Я думаю, это то, что вы ищете...
>>> 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)
Используйте 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)
replace
Я знаю, что принятый ответ от четырех лет назад работает, но это кажется чуть легче, чем использование replace
:
dt = datetime.date.today()
dt = datetime.datetime(dt.year, dt.month, dt.day)
Примечания
datetime
, не передавая свойства времени конструктору, вы получаете полночь.dt = datetime.datetime.now()
Вы не можете усечь объект datetime, потому что он неизменен.
Тем не менее, есть один способ построить новое поле даты/времени с полями 0 час, минута, секунда и микросекунды, не выбрасывая исходную дату или tzinfo:
newdatetime = now.replace(hour=0, minute=0, second=0, microsecond=0)
Чтобы получить полуночью, соответствующую заданному объекту 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 в "полночь" для заданного часового пояса?
Вы можете использовать панды для этого (хотя это может быть накладным расходом для этой задачи). Вы можете использовать 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
"""
Вы можете использовать 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
Для манипулирования датами есть большая библиотека: 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>)
Существует модуль datetime_truncate, который обрабатывает это для вас. Он просто вызывает datetime.replace.
Вы можете использовать просто datetime.date.today(), чтобы он светился и возвращал то, что вы хотите
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]')
веселит
Если вы имеете дело с 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)
>>> import datetime
>>> dt = datetime.datetime.now()
>>> datetime.datetime.date(dt)
datetime.date(2019, 4, 2)
Что означает усечение?
У вас есть полный контроль над форматированием с помощью метода strftime() и с использованием соответствующей строки формата.
http://docs.python.org/library/datetime.html#strftime-strptime-behavior