Saya menggunakan modul Python datetime. Saya mencari untuk menghitung tanggal 6 bulan dari tanggal saat ini. Bisakah seseorang memberi saya sedikit bantuan untuk melakukan ini?
Alasan saya ingin menghasilkan tanggal 6 bulan dari tanggal saat ini adalah untuk menghasilkan tanggal peninjauan . Jika pengguna memasukkan data ke dalam sistem, ia akan memiliki tanggal peninjauan 6 bulan dari tanggal mereka memasukkan data.
6
, dengan dukungan untuk memutar tahun (dan bersepeda kembali ke bulan1
) jika kita melewati Desember. Ini terjadi persis seperti apa yang sebenarnyarelativedelta
dilakukan oleh setiap bahasa pemrograman dengan dukungan untuk konsep semacam ini.date(2015, 3, 31) + relativedelta(months = 6)
memberidatetime.date(2015, 9, 30)
. Perl:DateTime->new(year=>2000, month=>3, day=>31)->add(months=>6)
memberi2000-10-01T00:00:00
. Php:date_create('2000-03-31', new DateTimeZone('UTC'))->add(new DateInterval('P6M'))
memberikan 2000-10-01. Pilih racunmu.Jawaban:
Saya menemukan solusi ini bagus. (Ini menggunakan ekstensi python-dateutil )
Keuntungan dari pendekatan ini adalah bahwa ia menangani masalah dengan 28, 30, 31 hari dll. Ini menjadi sangat berguna dalam menangani aturan dan skenario bisnis (katakanlah pembuatan faktur dll.)
sumber
relativedelta
fungsi ini juga berlakumonth
sebagai argumen, yang pada dasarnya menggantikan / set / perbaikan bulan pada tanggal yang dilewati, yang sangat berbeda dengan menambahkan lebih banyak bulan. Hanya sebuah peringatan bagi orang-orang bertanya-tanya apakah fungsi tersebut rusak karena mereka lupa ekstra s di bulan .datetime
secara default. Saya sebenarnya mengira saya bisa melewati "bulan" ke dalam timedelta.Yah, itu tergantung apa yang Anda maksud dengan 6 bulan dari tanggal saat ini.
Menggunakan bulan alami:
Menggunakan definisi bankir, 6 * 30:
sumber
(day, month, year) = (day, (month+6)%12, year+(month+6)/12)
dapat bermasalah, karena menghasilkan tanggal yang tidak valid seperti(31, 8, 2015)
->(31, 2, 2016)
Dengan Python 3.x Anda dapat melakukannya seperti ini:
tetapi Anda perlu menginstal modul python-dateutil :
sumber
pip install ...
from dateutil.relativedelta import relativedelta
. Penggunaannyaimport *
tidak eksplisit.Untuk perhitungan awal bulan ke bulan:
sumber
Apa yang Anda maksud dengan "6 bulan"?
Apakah 2009-02-13 + 6 bulan == 2009-08-13? Atau 2009-02-13 + 6 * 30 hari?
Info lebih lanjut tentang mx.DateTime
sumber
Jadi, berikut adalah contoh yang
dateutil.relativedelta
menurut saya berguna untuk pengulangan selama setahun terakhir, melewatkan satu bulan setiap kali hingga saat ini:Seperti jawaban lain, Anda harus mencari tahu apa yang sebenarnya Anda maksud dengan "6 bulan dari sekarang." Jika maksud Anda "hari ini di bulan dalam enam bulan di masa depan" maka ini akan berlaku:
sumber
Solusi ini berfungsi dengan benar untuk bulan Desember, yang sebagian besar jawaban di halaman ini tidak. Anda harus terlebih dahulu menggeser bulan dari basis 1 (yaitu Jan = 1) ke basis 0 (yaitu Jan = 0) sebelum menggunakan modulus (%) atau pembagian integer (//), jika tidak November (11) ditambah 1 bulan memberi Anda 12 , yang ketika menemukan sisanya (12% 12) memberikan 0.
(Dan jangan sarankan "(bulan% 12) + 1" atau Oktober + 1 = Desember!)
Namun ... Ini tidak memperhitungkan masalah seperti 31 Januari + satu bulan. Jadi kami kembali ke OP - apa maksud Anda dengan menambahkan satu bulan? Salah satu solusinya adalah mundur hingga Anda mendapatkan hari yang valid, mengingat sebagian besar orang akan menganggap hari terakhir bulan Januari, ditambah satu bulan, sama dengan hari terakhir bulan Februari. Ini juga akan bekerja pada angka negatif bulan juga. Bukti:
sumber
Saya tahu ini selama 6 bulan, namun jawabannya menunjukkan di google untuk "menambahkan bulan dengan python" jika Anda menambahkan satu bulan:
ini akan menghitung hari di bulan ini dan menambahkannya ke tanggal saat ini, menggunakan 365/12 akan 1/12 dari setahun dapat menyebabkan masalah untuk bulan pendek / panjang jika iterasi Anda melebihi tanggal.
sumber
Tidak ada cara langsung untuk melakukannya dengan dat Python.
Lihatlah tipe relativedelta di python-dateutil . Ini memungkinkan Anda untuk menentukan delta waktu dalam bulan.
sumber
Cukup gunakan metode timetuple untuk mengekstrak bulan, tambahkan bulan Anda, dan buat objek tanggal baru. Jika ada metode yang sudah ada untuk ini, saya tidak tahu itu.
API agak canggung, tetapi berfungsi sebagai contoh. Jelas juga tidak akan bekerja pada kasus sudut seperti 2008-01-31 + 1 bulan. :)
sumber
new_month % 12
seharusnya(new_month % 12) or 12
. Kalau tidak, jika Anda mencoba ini pada bulan November Anda akan mendapatkan kesalahan. :)Paket Dateutil memiliki implementasi fungsi tersebut. Namun perlu diperhatikan, bahwa ini akan naif , seperti yang sudah ditunjukkan orang lain.
sumber
Menggunakan pustaka standar Python, yaitu tanpa
dateutil
atau orang lain, dan memecahkan masalah '31 Februari':Pengujian:
sumber
add_months(datetime.date(2018, 11, 30), 1)
pengembaliandatetime.date(2019, 12, 30)
(tahun harus 2018, bukan 2019). Jadi, lebih baik gunakan perpustakaan khusus yang telah teruji untuk ini! Jika Anda benar-benar hanya perlu menggunakan modul perpustakaan standar, lihat jawaban saya untuk pertanyaan serupa .Saya memiliki cara yang lebih baik untuk menyelesaikan masalah '31 Februari':
Saya pikir itu juga berfungsi dengan angka negatif (untuk mengurangi bulan), tetapi saya belum banyak menguji ini.
sumber
Kelas QDate dari PyQt4 memiliki fungsi addmonths.
sumber
Bagaimana dengan ini? Tidak menggunakan perpustakaan lain (
dateutil
) atautimedelta
? berdasarkan jawaban vartec saya melakukan ini dan saya yakin itu berhasil:Saya mencoba menggunakan
timedelta
, tetapi karena menghitung hari,365/2
atau6*356/12
tidak selalu diterjemahkan menjadi 6 bulan, tetapi 182 hari. misalnyaSaya percaya bahwa kita biasanya berasumsi bahwa 6 bulan dari hari tertentu akan mendarat pada hari yang sama tetapi 6 bulan kemudian (yaitu
2015-03-10
->2015-09-10
, Tidak2015-09-08
)Saya harap kamu terbantu dengan hal ini.
sumber
day + datetime.timedelta(6*365/12)
tidak akan bekerja selalu, karena beberapa tahun memiliki 365 hari dan yang lain memiliki 366 hari.Ini tidak menjawab pertanyaan spesifik (
datetime
hanya menggunakan ) tetapi, mengingat bahwa orang lain menyarankan penggunaan modul yang berbeda, di sini ada solusi menggunakanpandas
.Yang berfungsi seperti yang diharapkan dalam tahun kabisat
sumber
Memodifikasi AddMonths () untuk digunakan di Zope dan menangani nomor hari yang tidak valid:
sumber
sumber
sumber
Dimodifikasi jawaban Johannes Wei dalam kasus 1new_month = 121. Ini berfungsi dengan baik untuk saya. Bulan-bulan bisa positif atau negatif.
sumber
Namun solusi lain - harap seseorang akan menyukainya:
Solusi ini tidak berfungsi untuk hari ke 29,30,31 untuk semua kasus, jadi diperlukan solusi yang lebih kuat (yang sudah tidak bagus lagi :)):
sumber
Dari jawaban ini , lihat parsedatetime . Contoh kode berikut. Lebih detail: uji unit dengan banyak bahasa alami -> contoh konversi YYYY-MM-DD , dan tantangan / bug konversi parsedatetime seumur hidup .
Kode di atas menghasilkan yang berikut dari mesin MacOSX:
sumber
Berikut adalah contoh yang memungkinkan pengguna untuk memutuskan bagaimana mengembalikan tanggal di mana hari lebih besar dari jumlah hari dalam sebulan.
sumber
mengingat bahwa variabel datetime Anda disebut tanggal:
sumber
Fungsi umum untuk mendapatkan tanggal berikutnya setelah / sebelum x bulan.
sumber
Saran cepat adalah Panah
pip pasang panah
sumber
Gunakan modul datetime python untuk menambahkan timedelta enam bulan ke datetime.today ().
http://docs.python.org/library/datetime.html
Anda tentu saja harus menyelesaikan masalah yang diangkat oleh Johannes Weiß-- apa yang Anda maksud dengan 6 bulan?
sumber
Inilah yang saya pikirkan. Memindahkan jumlah bulan dan tahun yang benar tetapi mengabaikan hari (yang saya butuhkan dalam situasi saya).
sumber
Saya menggunakan fungsi ini untuk mengubah tahun dan bulan tetapi pertahankan hari:
Anda harus menulis:
sumber
Saya pikir akan lebih aman untuk melakukan hal seperti ini daripada menambahkan hari secara manual:
sumber