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.
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)
replace()
metode mengembalikan objek datetime, sehingga mantera yang benar adalah:dt = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
datetime
, bukandate
keberatan (bahwa Anda bisa menggunakandt.date()
panggilan (tidak perlu menggunakan konstruktor eksplisit)). The.replace()
metode mungkin gagal jikadatetime
menambahkan dukungan nanodetik . Anda bisa menggunakannyadatetime.combine()
sebagai gantinya .datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
?Gunakan
date
bukandatetime
jika Anda tidak peduli waktu.Anda dapat memperbarui datetime seperti ini:
sumber
Empat tahun kemudian: cara lain, menghindari
replace
Saya tahu jawaban yang diterima dari empat tahun lalu berhasil, tetapi ini agak lebih ringan daripada menggunakan
replace
:Catatan
datetime
objek tanpa meneruskan properti waktu ke konstruktor, Anda mendapatkan tengah malam.dt = datetime.datetime.now()
sumber
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:
sumber
replace
opsi terlebih dahulu, karena mungkin itulah yang mereka inginkan.tzinfo=now.tzinfo
. Padatzinfo
tengah malam mungkin berbeda misalnya, utc offset pada2012-04-01 00:09:00
(09:00) di zona waktu Australia / MelbourneAEST+10:00
tetapiAEDT+11:00
pada2012-04-01 00:00:00
(tengah malam) - ada transisi akhir-DST pada hari itu. Anda dapat menggunakanpytz
modul untuk memperbaikinya, lihat jawaban saya.Untuk mendapatkan tengah malam yang terkait dengan objek datetime tertentu, Anda bisa menggunakan
datetime.combine()
metode :Keuntungan dibandingkan dengan yang
.replace()
metode adalah bahwadatetime.combine()
solusi berbasis akan terus bekerja bahkan jikadatetime
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 (pengaturantzinfo
atribut waktu) mungkin gagal. Lihat Bagaimana cara saya mendapatkan waktu UTC "tengah malam" untuk zona waktu tertentu?sumber
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 :
sumber
Anda dapat menggunakan datetime.strftime untuk mengekstrak hari, bulan, tahun ...
Contoh:
Output (untuk hari ini):
Jika Anda hanya ingin mengambil hari, Anda dapat menggunakan atribut hari seperti:
Ouput (untuk hari ini):
sumber
d.day
dll.Ada perpustakaan hebat yang digunakan untuk memanipulasi tanggal: Delorean
dan jika Anda ingin mendapatkan nilai datetime kembali:
sumber
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:
sumber
Ada modul datetime_truncate yang menangani ini untuk Anda. Itu hanya panggilan datetime.replace.
sumber
6 tahun kemudian ... Saya menemukan posting ini dan saya lebih suka pendekatan numpy:
Bersulang
sumber
sumber
Anda bisa menggunakannya
Ringan dan mengembalikan apa yang Anda inginkan.
sumber
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
sumber
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
Kita bisa memeriksanya membandingkan waktu berjalan antara fungsi ganti dan fungsi lantai.
sumber
Inilah cara lain yang cocok dalam satu baris tetapi tidak terlalu elegan:
sumber