Який класний спосіб урізати об'єкт дата-пітону?
В даному конкретному випадку - до дня. Таким чином, встановлення години, хвилини, секунд і мікросекунд до 0.
Я хотів би, щоб вихід також був об'єктом дати, а не рядком.
Який класний спосіб урізати об'єкт дата-пітону?
В даному конкретному випадку - до дня. Таким чином, встановлення години, хвилини, секунд і мікросекунд до 0.
Я хотів би, щоб вихід також був об'єктом дати, а не рядком.
Відповіді:
Я думаю, що це те, що ти шукаєш ...
>>> 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)
datetime, а не dateзаперечує (щоб ви могли отримати dt.date()дзвінки (не потрібно використовувати явний конструктор)). .replace()Метод може потерпіти невдачу , якщо datetimeдодає підтримку наносекунд . Ви можете використати datetime.combine()натомість .
datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)?
Скористайтеся знаком " 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)
replaceЯ знаю, що прийнята відповідь від чотирьох років тому працює, але це здається легше, ніж використання replace:
dt = datetime.date.today()
dt = datetime.datetime(dt.year, dt.month, dt.day)
Примітки
datetimeоб'єкт, не передаючи властивостям часу конструктору, ви отримуєте півночі.dt = datetime.datetime.now()Ви не можете обрізати об'єкт дати, оскільки він незмінний .
Однак ось один спосіб побудувати новий час дати з полями 0 годин, хвилини, секунди та мікросекунди, не відкидаючи початкову дату чи tzinfo:
newdatetime = now.replace(hour=0, minute=0, second=0, microsecond=0)
replaceваріант спочатку, оскільки це, мабуть, те, що вони хочуть.
tzinfo=now.tzinfo. tzinfoОпівночі може бути іншою , наприклад, зміщення в UTC 2012-04-01 00:09:00(9 ранку) в Австралії / Мельбурн часовому поясі знаходиться , AEST+10:00але це AEDT+11:00в 2012-04-01 00:00:00(опівночі) - є з вичерпаним ДСТ перехід в той же день. Ви можете використати pytzмодуль, щоб виправити це, дивіться мою відповідь.
Щоб отримати опівночі, що відповідає заданому об'єкту дати, ви можете використовувати 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може бути збережено при необхідності, але зміщення потужності може бути різним опівночі, наприклад, через перехід DST, і тому наївне рішення (встановлення tzinfoатрибуту часу) може вийти з ладу. Дивіться, як я можу отримати UTC за "півночі" за заданий часовий пояс?
Ви можете використовувати панди для цього (хоча це може бути накладні витрати для цього завдання). Ви можете використовувати круглий , підлогу і 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.strWeather для вилучення дня, місяця, року ...
Приклад:
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
Вихід (на сьогодні):
29
d.dayі т.д.
Існує велика бібліотека, яка використовується для маніпулювання датами: 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')
і якщо ви хочете повернути значення дати:
>>> d.truncate('year').datetime
datetime.datetime(2015, 1, 1, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>)
Детальніше див. На https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.dt.floor.html
Зараз 2019 рік, я думаю, що найефективніший спосіб це зробити:
df['truncate_date'] = df['timestamp'].dt.floor('d')
Через 6 років ... Я знайшов цю посаду і мені більше сподобався нудний підступ:
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]')
ура
>>> import datetime
>>> dt = datetime.datetime.now()
>>> datetime.datetime.date(dt)
datetime.date(2019, 4, 2)
Можна просто використовувати
datetime.date.today()
Це світло і повертає саме те, що ви хочете.
Що означає усічення?
Ви маєте повний контроль над форматуванням, використовуючи метод strbreak () та використовуючи відповідний рядок формату.
http://docs.python.org/library/datetime.html#strearch-strptime-behavior
Якщо ви маєте справу з серією типу 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)
Ось ще один спосіб, який вписується в одну лінію, але не особливо елегантний:
dt = datetime.datetime.fromordinal(datetime.date.today().toordinal())