Apakah ada cara menggunakan pustaka standar Python untuk dengan mudah menentukan (yaitu satu panggilan fungsi) hari terakhir dari bulan yang diberikan?
Jika perpustakaan standar tidak mendukung itu, apakah paket dateutil mendukung ini?
Saya tidak memperhatikan ini sebelumnya ketika saya melihat dokumentasi untuk calendar
modul , tetapi metode yang disebut monthrange
memberikan informasi ini:
monthrange (year, month)
Mengembalikan hari kerja di hari pertama bulan itu dan jumlah hari dalam sebulan, untuk tahun dan bulan yang ditentukan.
>>> import calendar
>>> calendar.monthrange(2002,1)
(1, 31)
>>> calendar.monthrange(2008,2)
(4, 29)
>>> calendar.monthrange(2100,2)
(0, 28)
begitu:
calendar.monthrange(year, month)[1]
sepertinya cara termudah untuk pergi.
Supaya jelas, monthrange
mendukung tahun kabisat juga:
>>> from calendar import monthrange
>>> monthrange(2012, 2)
(2, 29)
Jawaban saya sebelumnya masih berfungsi, tetapi jelas suboptimal.
28
sebagai jawaban, yang benar, menggunakan aturan untuk kalender Gregorianmonthrange
adalah nama yang membingungkan. Anda akan berpikir itu akan kembali(first_day, last_day)
, tidak(week_day_of_first_day, number_of_days)
Jika Anda tidak ingin mengimpor
calendar
modul, fungsi dua langkah sederhana juga bisa:Output:
sumber
EDIT: Lihat jawaban @Blair Conrad untuk solusi yang lebih bersih
sumber
today.month + 1 == 13
dan Anda mendapatkanValueError
.(today.month % 12) + 1
sejak12 % 12
memberikan 0Ini sebenarnya cukup mudah dengan
dateutil.relativedelta
(paket python-datetutil untuk pip).day=31
akan selalu selalu kembali pada hari terakhir bulan itu.Contoh:
sumber
datetime(2014, 2, 1) + relativedelta(days=31)
memberidatetime(2014, 3, 4, 0, 0)
...months
ditambahkan, kemudianseconds
dikurangi. Karena mereka disahkan karena**kwargs
saya tidak akan bergantung pada itu dan melakukan serangkaian operasi terpisah:now + relative(months=+1) + relative(day=1) + relative(days=-1)
yang tidak ambigu.last_day = (<datetime_object> + relativedelta(day=31)).day
EDIT: lihat jawaban saya yang lain . Ini memiliki implementasi yang lebih baik daripada yang ini, yang saya tinggalkan di sini kalau-kalau ada seseorang yang tertarik melihat bagaimana seseorang bisa "menggulung Anda sendiri" kalkulator.
@John Millikin memberikan jawaban yang baik, dengan komplikasi tambahan dalam menghitung hari pertama bulan berikutnya.
Berikut ini tidak terlalu elegan, tetapi untuk mencari tahu hari terakhir bulan itu pada tanggal tertentu, Anda dapat mencoba:
sumber
today = datetime.date.today(); start_date = today.replace(day=1)
. Anda ingin menghindari menelepon datetime. Sekarang dua kali, kalau-kalau Anda menyebutnya sebelum tengah malam pada tanggal 31 dan kemudian setelah tengah malam. Anda akan mendapatkan 2016-01-01 bukannya 2016-12-01 atau 2017-01-01.date
adalah instance daridatetime.date
,datetime.datetime
dan jugapandas.Timestamp
.Menggunakan
dateutil.relativedelta
Anda akan mendapatkan tanggal terakhir bulan seperti ini:Idenya adalah untuk mendapatkan hari pertama bulan itu dan gunakan
relativedelta
untuk pergi 1 bulan ke depan dan 1 hari kembali sehingga Anda akan mendapatkan hari terakhir bulan yang Anda inginkan.sumber
Solusi lain adalah melakukan sesuatu seperti ini:
Dan gunakan fungsi seperti ini:
sumber
sumber
sumber
jika Anda bersedia menggunakan perpustakaan eksternal, lihat http://crsmithdev.com/arrow/
Anda dapat memperoleh hari terakhir bulan itu dengan:
Ini mengembalikan objek tanggal yang kemudian dapat Anda lakukan manipulasi Anda.
sumber
Untuk mendapatkan tanggal terakhir bulan ini kami melakukan sesuatu seperti ini:
Sekarang untuk menjelaskan apa yang kita lakukan di sini kita akan memecahnya menjadi dua bagian:
pertama adalah mendapatkan jumlah hari dalam bulan ini yang kami gunakan untuk mengatur rentang bulan yang sudah disebutkan oleh Blair Conrad solusinya:
kedua adalah mendapatkan tanggal terakhir itu sendiri yang kami lakukan dengan bantuan ganti mis
dan ketika kita menggabungkannya seperti yang disebutkan di atas kita mendapatkan solusi yang dinamis.
sumber
date.replace(day=day)
sehingga semua orang tahu apa yang terjadi.Di Python 3.7 ada fungsi tidak berdokumen
calendar.monthlen(year, month)
:Ini setara dengan panggilan yang didokumentasikan
calendar.monthrange(year, month)[1]
.sumber
sumber
Gunakan panda!
sumber
pd.series.dt.is_month_end
tautannow=datetime.datetime.now(); pd_now = pd.to_datetime(now); print(pd_now.days_in_month)
Bagi saya itu cara paling sederhana:
sumber
Cara termudah (tanpa harus mengimpor kalender), adalah untuk mendapatkan hari pertama bulan berikutnya, dan kemudian kurangi satu hari darinya.
Keluaran:
PS: Kode ini berjalan lebih cepat dibandingkan dengan
import calendar
pendekatan; Lihat di bawah:KELUARAN:
Kode ini mengasumsikan bahwa Anda menginginkan tanggal hari terakhir bulan itu (yaitu, bukan hanya bagian DD, tetapi seluruh tanggal YYYYMMDD)
sumber
import calendar
?Ini jawaban lain. Tidak diperlukan paket tambahan.
Dapatkan hari pertama bulan berikutnya dan kurangi satu hari darinya.
sumber
Anda dapat menghitung sendiri tanggal akhirnya. Logikanya sederhana adalah mengurangi satu hari dari tanggal mulai bulan depan. :)
Jadi, tulis metode khusus,
Panggilan,
Ini akan mengembalikan tanggal akhir bulan ini. Berikan tanggal apa pun ke fungsi ini. mengembalikan tanggal akhir bulan itu kepada Anda.
sumber
Anda dapat menggunakan relativedelta https://dateutil.readthedocs.io/en/stable/relativedelta.html
month_end = <your datetime value within the month> + relativedelta(day=31)
yang akan memberi Anda hari terakhir.sumber
Ini adalah solusi paling sederhana bagi saya hanya menggunakan perpustakaan datetime standar:
sumber
Ini tidak menjawab pertanyaan utama, tetapi satu trik bagus untuk mendapatkan hari kerja terakhir dalam sebulan adalah menggunakan
calendar.monthcalendar
, yang mengembalikan matriks tanggal, yang diselenggarakan dengan Senin sebagai kolom pertama hingga Minggu sebagai yang terakhir.Seluruh
[0:-2]
hal yang mencukur kolom akhir pekan dan melemparkan mereka keluar. Tanggal yang jatuh di luar bulan ditandai dengan 0, sehingga maks secara efektif mengabaikannya.Penggunaan
numpy.ravel
tidak sepenuhnya diperlukan, tapi saya benci mengandalkan konvensi belaka yangnumpy.ndarray.max
akan meratakan array jika tidak diberi tahu sumbu mana yang harus dihitung.sumber
Keluaran:
Ini akan mencetak hari terakhir dari bulan apa pun saat ini. Dalam contoh ini adalah 15 Mei 2016. Jadi output Anda mungkin berbeda, namun outputnya akan sama dengan hari saat bulan ini. Hebat jika Anda ingin memeriksa hari terakhir bulan itu dengan menjalankan tugas cron harian.
Begitu:
Keluaran:
Kecuali itu ADALAH hari terakhir bulan itu.
sumber
Saya lebih suka cara ini
sumber
Jika Anda ingin membuat fungsi kecil Anda sendiri, ini adalah titik awal yang baik:
Untuk ini, Anda harus tahu aturan untuk tahun kabisat:
sumber
Jika Anda melewati rentang tanggal, Anda dapat menggunakan ini:
sumber
Dalam kode di bawah ini 'get_last_day_of_month (dt)' akan memberi Anda ini, dengan tanggal dalam format string seperti 'YYYY-MM-DD'.
sumber
Cara paling sederhana adalah dengan menggunakan
datetime
dan beberapa matematika tanggal, mis. Kurangi satu hari dari hari pertama bulan berikutnya:Atau, Anda dapat menggunakan
calendar.monthrange()
untuk mendapatkan jumlah hari dalam sebulan (dengan memperhitungkan tahun kabisat) dan memperbarui tanggal sesuai dengan itu:Patokan cepat menunjukkan bahwa versi pertama terasa lebih cepat:
sumber
Ini adalah versi yang panjang (mudah dipahami) tetapi menangani tahun kabisat.
bersorak, JK
sumber
else: pass
dan juga Anda dapat menghapusif year % 400 == 0: leap_year_flag = 1
dengan modifikasi kecilBerikut ini adalah solusi berdasarkan python lambdas:
The
next_month
lambda menemukan representasi tuple dari hari pertama bulan berikutnya, dan berguling ke tahun depan. Themonth_end
lambda mengubah tanggal (dte
) untuk tupel, berlakunext_month
dan menciptakan tanggal baru. Maka "akhir bulan" hanyalah hari pertama minus bulan depantimedelta(days=1)
.sumber