Apa cara berkelas untuk memotong objek datetime python?
Dalam kasus khusus ini, hingga hari ini. Jadi pada dasarnya mengatur jam, menit, detik, dan mikrodetik ke 0.
Saya ingin output juga menjadi objek datetime, bukan string.
Apa cara berkelas untuk memotong objek datetime python?
Dalam kasus khusus ini, hingga hari ini. Jadi pada dasarnya mengatur jam, menit, detik, dan mikrodetik ke 0.
Saya ingin output juga menjadi objek datetime, bukan string.
Jawaban:
Saya pikir ini yang Anda cari ...
>>> 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)
Tetapi jika Anda benar-benar tidak peduli dengan aspek waktu dari hal-hal, maka Anda harus benar-benar hanya berkeliling date
benda ...
>>> d_truncated = datetime.date(dt.year, dt.month, dt.day)
>>> d_truncated
datetime.date(2011, 3, 29)
datetime
, bukan date
keberatan (bahwa Anda bisa menggunakan dt.date()
panggilan (tidak perlu menggunakan konstruktor eksplisit)). The .replace()
metode mungkin gagal jika datetime
menambahkan dukungan nanodetik . Anda bisa menggunakannya datetime.combine()
sebagai gantinya .
datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
?
Gunakan date
bukan datetime
jika Anda tidak peduli waktu.
>>> now = datetime.now()
>>> now.date()
datetime.date(2011, 3, 29)
Anda dapat memperbarui datetime seperti ini:
>>> now.replace(minute=0, hour=0, second=0, microsecond=0)
datetime.datetime(2011, 3, 29, 0, 0)
replace
Saya tahu jawaban yang diterima dari empat tahun lalu berhasil, tetapi ini agak lebih ringan daripada menggunakan replace
:
dt = datetime.date.today()
dt = datetime.datetime(dt.year, dt.month, dt.day)
Catatan
datetime
objek tanpa meneruskan properti waktu ke konstruktor, Anda mendapatkan tengah malam.dt = datetime.datetime.now()
Anda tidak dapat memotong objek datetime karena tidak dapat diubah .
Namun, berikut adalah salah satu cara untuk membangun datetime baru dengan bidang 0 jam, menit, detik, dan mikrodetik, tanpa membuang tanggal asli atau tzinfo:
newdatetime = now.replace(hour=0, minute=0, second=0, microsecond=0)
replace
opsi terlebih dahulu, karena mungkin itulah yang mereka inginkan.
tzinfo=now.tzinfo
. Pada tzinfo
tengah malam mungkin berbeda misalnya, utc offset pada 2012-04-01 00:09:00
(09:00) di zona waktu Australia / Melbourne AEST+10:00
tetapi AEDT+11:00
pada 2012-04-01 00:00:00
(tengah malam) - ada transisi akhir-DST pada hari itu. Anda dapat menggunakan pytz
modul untuk memperbaikinya, lihat jawaban saya.
Untuk mendapatkan tengah malam yang terkait dengan objek datetime tertentu, Anda bisa menggunakan datetime.combine()
metode :
>>> 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)
Keuntungan dibandingkan dengan yang .replace()
metode adalah bahwa datetime.combine()
solusi berbasis akan terus bekerja bahkan jika datetime
memperkenalkan modul nanodetik mendukung .
tzinfo
dapat dipertahankan jika perlu tetapi utc offset mungkin berbeda pada tengah malam misalnya, karena transisi DST dan karena itu solusi naif (pengaturan tzinfo
atribut waktu) mungkin gagal. Lihat Bagaimana cara saya mendapatkan waktu UTC "tengah malam" untuk zona waktu tertentu?
Anda bisa menggunakan panda untuk itu (meskipun bisa jadi overhead untuk tugas itu). Anda bisa menggunakan round , floor , dan ceil seperti untuk nomor biasa dan frekuensi panda dari alias-offset :
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
"""
Anda dapat menggunakan datetime.strftime untuk mengekstrak hari, bulan, tahun ...
Contoh:
from datetime import datetime
d = datetime.today()
# Retrieves the day and the year
print d.strftime("%d-%Y")
Output (untuk hari ini):
29-2011
Jika Anda hanya ingin mengambil hari, Anda dapat menggunakan atribut hari seperti:
from datetime import datetime
d = datetime.today()
# Retrieves the day
print d.day
Ouput (untuk hari ini):
29
d.day
dll.
Ada perpustakaan hebat yang digunakan untuk memanipulasi tanggal: 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')
dan jika Anda ingin mendapatkan nilai datetime kembali:
>>> d.truncate('year').datetime
datetime.datetime(2015, 1, 1, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>)
Lihat lebih lanjut di https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.dt.floor.html
Sekarang tahun 2019, saya pikir cara paling efisien untuk melakukannya adalah:
df['truncate_date'] = df['timestamp'].dt.floor('d')
6 tahun kemudian ... Saya menemukan posting ini dan saya lebih suka pendekatan numpy:
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]')
Bersulang
Anda bisa menggunakannya
datetime.date.today()
Ringan dan mengembalikan apa yang Anda inginkan.
Apa artinya memotong?
Anda memiliki kontrol penuh atas pemformatan dengan menggunakan metode strftime () dan menggunakan string format yang sesuai.
http://docs.python.org/library/datetime.html#strftime-strptime-behavior
Jika Anda berurusan dengan serangkaian tipe DateTime, ada cara yang lebih efisien untuk memotongnya, khususnya ketika objek Seri memiliki banyak baris.
Anda dapat menggunakan fungsi lantai
Misalnya, jika Anda ingin memotongnya menjadi jam:
Hasilkan kisaran tanggal
times = pd.Series(pd.date_range(start='1/1/2018 04:00:00', end='1/1/2018 22:00:00', freq='s'))
Kita bisa memeriksanya membandingkan waktu berjalan antara fungsi ganti dan fungsi lantai.
%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)
Inilah cara lain yang cocok dalam satu baris tetapi tidak terlalu elegan:
dt = datetime.datetime.fromordinal(datetime.date.today().toordinal())