Bagaimana cara menghitung tanggal enam bulan dari tanggal saat ini menggunakan modul datetime Python?

391

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.

RailsSon
sumber
2
Anda harus lebih spesifik: kapan enam bulan dari 31 Maret? Dan dari 30 Agustus?
kmkaplan
3
Ya hasil edit membantu: itu berarti Anda dapat mendekati 6 bulan hingga 183 hari tanpa efek buruk. Jadi menambahkan 183 hari untuk hari ini akan membantu.
kmkaplan
15
Komentar di atas menurut saya konyol. Konsep "menambah enam bulan" cukup jelas - ambil komponen bulan dan tambahkan 6, dengan dukungan untuk memutar tahun (dan bersepeda kembali ke bulan 1) jika kita melewati Desember. Ini terjadi persis seperti apa yang sebenarnya relativedeltadilakukan oleh setiap bahasa pemrograman dengan dukungan untuk konsep semacam ini.
Kirk Woll
5
@KirkWoll: Saya yakin ini cukup jelas. Tetapi masih berbeda untuk siapa pun yang berbicara. Python: date(2015, 3, 31) + relativedelta(months = 6)memberi datetime.date(2015, 9, 30). Perl: DateTime->new(year=>2000, month=>3, day=>31)->add(months=>6)memberi 2000-10-01T00:00:00. Php: date_create('2000-03-31', new DateTimeZone('UTC'))->add(new DateInterval('P6M'))memberikan 2000-10-01. Pilih racunmu.
kmkaplan
2
... menambahkan 182 tampaknya lebih pragmatis untuk menghasilkan tanggal peninjauan : ini membuat hari minggu tetap utuh.
Wolf

Jawaban:

1047

Saya menemukan solusi ini bagus. (Ini menggunakan ekstensi python-dateutil )

from datetime import date
from dateutil.relativedelta import relativedelta

six_months = date.today() + relativedelta(months=+6)

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.)

$ date(2010,12,31)+relativedelta(months=+1)
  datetime.date(2011, 1, 31)

$ date(2010,12,31)+relativedelta(months=+2)
  datetime.date(2011, 2, 28)
Mahendra
sumber
2
+6 adalah indikator yang bisa jadi -6, hal yang sama juga berlaku untuk hari dan tahun :)
securecurve
5
@sliders_alpha Anda perlu menginstal paket python-dateutil (pip install python-dateutil)
poiuytrez
18
Ini solusi yang tepat. Jika OP akan bertanya 6 tahun, bukan 6 bulan, maka jawaban yang disetujui akan gagal total. Jadi seseorang harus ingat bahwa jawabannya lebih bernilai semakin digeneralisasikan.
Daniel F
3
Harap perhatikan bahwa relativedeltafungsi ini juga berlaku monthsebagai 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 .
shad0w_wa1k3r
1
Saya ingin tahu: apakah ada yang tahu mengapa ini tidak termasuk secara default? Timedelta tampaknya dikemas datetimesecara default. Saya sebenarnya mengira saya bisa melewati "bulan" ke dalam timedelta.
dTanMan
51

Yah, itu tergantung apa yang Anda maksud dengan 6 bulan dari tanggal saat ini.

  1. Menggunakan bulan alami:

    (day, month, year) = (day, (month + 5) % 12 + 1, year + (month + 5)/12)
  2. Menggunakan definisi bankir, 6 * 30:

    date += datetime.timedelta(6 * 30)
vartec
sumber
3
Bisakah Anda memasukkan definisi setengah tahun (183 hari) ditambah definisi 26 minggu juga? Ini membantu untuk memiliki semuanya di satu tempat.
S.Lott
11
hanya komentar singkat: Saya pikir, untuk bulan, rumusnya adalah (bulan + 5)% 12 + 1 b / c untuk bulan Juni, rumus Anda memberikan 0 sedangkan hasil yang diharapkan adalah 12 ... meskipun ada sedikit kesalahan, untuk pikir saya, jawaban Anda adalah yang terbaik untuk menjawab pertanyaan
PierrOz
3
dan sama untuk tahun: seharusnya tahun + (bulan + 5) / 12
PierrOz
7
Bagaimana jika tanggalnya 31, dan bulan enam bulan kemudian tidak dapat memiliki 31 hari (yang merupakan kasus untuk sebagian besar bulan dengan 31 hari)?
akv
4
Downvote karena solusi pertama (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)
ohw
37

Dengan Python 3.x Anda dapat melakukannya seperti ini:

from datetime import datetime, timedelta
from dateutil.relativedelta import *

date = datetime.now()
print(date)
# 2018-09-24 13:24:04.007620

date = date + relativedelta(months=+6)
print(date)
# 2019-03-24 13:24:04.007620

tetapi Anda perlu menginstal modul python-dateutil :

pip install python-dateutil
Luka Lopusina
sumber
Dipilih untukpip install ...
Nathan
Saya akan merekomendasikan from dateutil.relativedelta import relativedelta. Penggunaannya import *tidak eksplisit.
Sam Morgan
19

Untuk perhitungan awal bulan ke bulan:

from datetime import timedelta
from dateutil.relativedelta import relativedelta

end_date = start_date + relativedelta(months=delta_period) + timedelta(days=-delta_period)
breddi
sumber
18
Ini bukan solusi relativedelta yang disebutkan di atas dalam komentar. Terus gulir untuk solusinya dengan 600+ upvotes.
Nostalg.io
15

Apa yang Anda maksud dengan "6 bulan"?

Apakah 2009-02-13 + 6 bulan == 2009-08-13? Atau 2009-02-13 + 6 * 30 hari?

import mx.DateTime as dt

#6 Months
dt.now()+dt.RelativeDateTime(months=6)
#result is '2009-08-13 16:28:00.84'

#6*30 days
dt.now()+dt.RelativeDateTime(days=30*6)
#result is '2009-08-12 16:30:03.35'

Info lebih lanjut tentang mx.DateTime

Johannes Weiss
sumber
14

Jadi, berikut adalah contoh yang dateutil.relativedeltamenurut saya berguna untuk pengulangan selama setahun terakhir, melewatkan satu bulan setiap kali hingga saat ini:

>>> import datetime
>>> from dateutil.relativedelta import relativedelta
>>> today = datetime.datetime.today()
>>> month_count = 0
>>> while month_count < 12:
...  day = today - relativedelta(months=month_count)
...  print day
...  month_count += 1
... 
2010-07-07 10:51:45.187968
2010-06-07 10:51:45.187968
2010-05-07 10:51:45.187968
2010-04-07 10:51:45.187968
2010-03-07 10:51:45.187968
2010-02-07 10:51:45.187968
2010-01-07 10:51:45.187968
2009-12-07 10:51:45.187968
2009-11-07 10:51:45.187968
2009-10-07 10:51:45.187968
2009-09-07 10:51:45.187968
2009-08-07 10:51:45.187968

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:

datetime.datetime.now() + relativedelta(months=6)
dannyman
sumber
14

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!)

def AddMonths(d,x):
    newmonth = ((( d.month - 1) + x ) % 12 ) + 1
    newyear  = int(d.year + ((( d.month - 1) + x ) / 12 ))
    return datetime.date( newyear, newmonth, d.day)

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:

>>> import datetime
>>> AddMonths(datetime.datetime(2010,8,25),1)
datetime.date(2010, 9, 25)
>>> AddMonths(datetime.datetime(2010,8,25),4)
datetime.date(2010, 12, 25)
>>> AddMonths(datetime.datetime(2010,8,25),5)
datetime.date(2011, 1, 25)
>>> AddMonths(datetime.datetime(2010,8,25),13)
datetime.date(2011, 9, 25)
>>> AddMonths(datetime.datetime(2010,8,25),24)
datetime.date(2012, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-1)
datetime.date(2010, 7, 25)
>>> AddMonths(datetime.datetime(2010,8,25),0)
datetime.date(2010, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-12)
datetime.date(2009, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-8)
datetime.date(2009, 12, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-7)
datetime.date(2010, 1, 25)>>> 
pengguna417751
sumber
3
Memperbaiki masalah "31 Jan + satu bulan": days_in_month = calendar.monthrange (newyear, newmonth) [1]; newday = min (d.day, days_in_month); (menabrak hari jika terlalu besar mis. 31 Februari hingga 28 Februari / 29)
Curtis Yallop
Ini bekerja untuk saya hanya dengan mengonversi tahun baru ke tipe data integer def AddMonths (d, x): newmonth = ((d.month - 1) + x)% 12) + 1 newyear = d.year + int (( (d.bulan - 1) + x) / 12) return datetime.date (newyear, newmonth, d.day)
Manmeet Singh
12

Saya tahu ini selama 6 bulan, namun jawabannya menunjukkan di google untuk "menambahkan bulan dengan python" jika Anda menambahkan satu bulan:

import calendar

date = datetime.date.today()    //Or your date

datetime.timedelta(days=calendar.monthrange(date.year,date.month)[1])

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.

Mike Davies
sumber
11

Tidak ada cara langsung untuk melakukannya dengan dat Python.

Lihatlah tipe relativedelta di python-dateutil . Ini memungkinkan Anda untuk menentukan delta waktu dalam bulan.

Akbar ibrahim
sumber
10

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.

import datetime

def in_the_future(months=1):
    year, month, day = datetime.date.today().timetuple()[:3]
    new_month = month + months
    return datetime.date(year + (new_month / 12), (new_month % 12) or 12, day)

API agak canggung, tetapi berfungsi sebagai contoh. Jelas juga tidak akan bekerja pada kasus sudut seperti 2008-01-31 + 1 bulan. :)

pi.
sumber
3
Kesalahan dalam kode Anda: new_month % 12seharusnya (new_month % 12) or 12. Kalau tidak, jika Anda mencoba ini pada bulan November Anda akan mendapatkan kesalahan. :)
Jordan Reiter
Ini sebenarnya jauh lebih bersih daripada solusi yang diterima. Ini tidak memerlukan impor baru, hanya matematika dasar
Simon PA
kembalikan datetime.date (tahun + (new_month / / 12), (new_month% 12) atau 12, hari)
paytam
9

Paket Dateutil memiliki implementasi fungsi tersebut. Namun perlu diperhatikan, bahwa ini akan naif , seperti yang sudah ditunjukkan orang lain.

zgoda
sumber
dateutil luar biasa. Itu dapat diinstal dengan easy_install juga.
Soviut
Luar biasa. Terima kasih telah menyarankan itu. Tampaknya itu adalah utusan dari Tuhan.
ayaz
9

Menggunakan pustaka standar Python, yaitu tanpa dateutilatau orang lain, dan memecahkan masalah '31 Februari':

import datetime
import calendar

def add_months(date, months):
    months_count = date.month + months

    # Calculate the year
    year = date.year + int(months_count / 12)

    # Calculate the month
    month = (months_count % 12)
    if month == 0:
        month = 12

    # Calculate the day
    day = date.day
    last_day_of_month = calendar.monthrange(year, month)[1]
    if day > last_day_of_month:
        day = last_day_of_month

    new_date = datetime.date(year, month, day)
    return new_date

Pengujian:

>>>date = datetime.date(2018, 11, 30)

>>>print(date, add_months(date, 3))
(datetime.date(2018, 11, 30), datetime.date(2019, 2, 28))

>>>print(date, add_months(date, 14))
(datetime.date(2018, 12, 31), datetime.date(2020, 2, 29))
David Ragazzi
sumber
Ini memiliki bug: Jika bulan target adalah Desember, itu akan mengembalikan tanggal satu tahun lebih lambat dari yang dibutuhkan. Contoh: add_months(datetime.date(2018, 11, 30), 1)pengembalian datetime.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 .
taleinat
5

Saya memiliki cara yang lebih baik untuk menyelesaikan masalah '31 Februari':

def add_months(start_date, months):
    import calendar

    year = start_date.year + (months / 12)
    month = start_date.month + (months % 12)
    day = start_date.day

    if month > 12:
        month = month % 12
        year = year + 1

    days_next = calendar.monthrange(year, month)[1]
    if day > days_next:
        day = days_next

    return start_date.replace(year, month, day)

Saya pikir itu juga berfungsi dengan angka negatif (untuk mengurangi bulan), tetapi saya belum banyak menguji ini.

amoyafoss
sumber
1
Jawaban ini memiliki kemampuan memecahkan masalah dengan benar menggunakan hanya pustaka Python bawaan. Periksa stackoverflow.com/a/4131114/302264 untuk jawaban yang setara tetapi sedikit lebih ringkas.
Eduardo Dobay
3

Kelas QDate dari PyQt4 memiliki fungsi addmonths.

>>>from PyQt4.QtCore import QDate  
>>>dt = QDate(2009,12,31)  
>>>required = dt.addMonths(6) 

>>>required
PyQt4.QtCore.QDate(2010, 6, 30)

>>>required.toPyDate()
datetime.date(2010, 6, 30)
pengguna213043
sumber
3

Bagaimana dengan ini? Tidak menggunakan perpustakaan lain ( dateutil) atau timedelta? berdasarkan jawaban vartec saya melakukan ini dan saya yakin itu berhasil:

import datetime

today = datetime.date.today()
six_months_from_today = datetime.date(today.year + (today.month + 6)/12, (today.month + 6) % 12, today.day)

Saya mencoba menggunakan timedelta, tetapi karena menghitung hari, 365/2atau 6*356/12tidak selalu diterjemahkan menjadi 6 bulan, tetapi 182 hari. misalnya

day = datetime.date(2015, 3, 10)
print day
>>> 2015-03-10

print (day + datetime.timedelta(6*365/12))
>>> 2015-09-08

Saya 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, Tidak 2015-09-08)

Saya harap kamu terbantu dengan hal ini.

Babak K
sumber
1
day + datetime.timedelta(6*365/12)tidak akan bekerja selalu, karena beberapa tahun memiliki 365 hari dan yang lain memiliki 366 hari.
3kstc
3

Ini tidak menjawab pertanyaan spesifik ( datetimehanya menggunakan ) tetapi, mengingat bahwa orang lain menyarankan penggunaan modul yang berbeda, di sini ada solusi menggunakan pandas.

import datetime as dt
import pandas as pd

date = dt.date.today() - \
       pd.offsets.DateOffset(months=6)

print(date)

2019-05-04 00:00:00

Yang berfungsi seperti yang diharapkan dalam tahun kabisat

date = dt.datetime(2019,8,29) - \
       pd.offsets.DateOffset(months=6)
print(date)

2019-02-28 00:00:00
rpanai
sumber
2

Memodifikasi AddMonths () untuk digunakan di Zope dan menangani nomor hari yang tidak valid:

def AddMonths(d,x):
    days_of_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    newmonth = ((( d.month() - 1) + x ) % 12 ) + 1
    newyear  = d.year() + ((( d.month() - 1) + x ) // 12 ) 
    if d.day() > days_of_month[newmonth-1]:
      newday = days_of_month[newmonth-1]
    else:
      newday = d.day() 
    return DateTime( newyear, newmonth, newday)
Jost
sumber
Ini tampaknya tidak mempertimbangkan tahun kabisat (29 hari pada bulan Februari).
tangani
2
import time

def add_month(start_time, months):  

        ret = time.strptime(start_time, '%Y-%m-%d')
        t = list(ret)

        t[1] += months

        if t[1] > 12:
            t[0] += 1 + int(months / 12)

            t[1] %= 12

        return int(time.mktime(tuple(t)))
ares
sumber
1
import datetime


'''
Created on 2011-03-09

@author: tonydiep
'''

def add_business_months(start_date, months_to_add):
    """
    Add months in the way business people think of months. 
    Jan 31, 2011 + 1 month = Feb 28, 2011 to business people
    Method: Add the number of months, roll back the date until it becomes a valid date
    """
    # determine year
    years_change = months_to_add / 12

    # determine if there is carryover from adding months
    if (start_date.month + (months_to_add % 12) > 12 ):
        years_change = years_change + 1

    new_year = start_date.year + years_change

    # determine month
    work = months_to_add % 12
    if 0 == work:
        new_month = start_date.month
    else:
        new_month = (start_date.month + (work % 12)) % 12

    if 0 == new_month:
        new_month = 12 

    # determine day of the month
    new_day = start_date.day
    if(new_day in [31, 30, 29, 28]):
        #user means end of the month
        new_day = 31


    new_date = None
    while (None == new_date and 27 < new_day):
        try:
            new_date = start_date.replace(year=new_year, month=new_month, day=new_day)
        except:
            new_day = new_day - 1   #wind down until we get to a valid date

    return new_date


if __name__ == '__main__':
    #tests
    dates = [datetime.date(2011, 1, 31),
             datetime.date(2011, 2, 28),
             datetime.date(2011, 3, 28),
             datetime.date(2011, 4, 28),
             datetime.date(2011, 5, 28),
             datetime.date(2011, 6, 28),
             datetime.date(2011, 7, 28),
             datetime.date(2011, 8, 28),
             datetime.date(2011, 9, 28),
             datetime.date(2011, 10, 28),
             datetime.date(2011, 11, 28),
             datetime.date(2011, 12, 28),
             ]
    months = range(1, 24)
    for start_date in dates:
        for m in months:
            end_date = add_business_months(start_date, m)
            print("%s\t%s\t%s" %(start_date, end_date, m))
tony diep
sumber
1

Dimodifikasi jawaban Johannes Wei dalam kasus 1new_month = 121. Ini berfungsi dengan baik untuk saya. Bulan-bulan bisa positif atau negatif.

def addMonth(d,months=1):
    year, month, day = d.timetuple()[:3]
    new_month = month + months
    return datetime.date(year + ((new_month-1) / 12), (new_month-1) % 12 +1, day)
Xinhui Tang
sumber
2
Ini TIDAK "bekerja dengan sempurna" ketika hari di tanggal mulai lebih besar dari jumlah hari di bulan target. Contoh: 2001-01-31 plus satu bulan mencoba membuat tanggal 2001-02-31.
John Machin
1

Namun solusi lain - harap seseorang akan menyukainya:

def add_months(d, months):
    return d.replace(year=d.year+months//12).replace(month=(d.month+months)%12)

Solusi ini tidak berfungsi untuk hari ke 29,30,31 untuk semua kasus, jadi diperlukan solusi yang lebih kuat (yang sudah tidak bagus lagi :)):

def add_months(d, months):
    for i in range(4):
        day = d.day - i
        try:
            return d.replace(day=day).replace(year=d.year+int(months)//12).replace(month=(d.month+int(months))%12)
        except:
            pass
    raise Exception("should not happen")
Robert Lujo
sumber
1

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 .

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time, calendar
from datetime import date

# from https://github.com/bear/parsedatetime
import parsedatetime as pdt

def print_todays_date():
    todays_day_of_week = calendar.day_name[date.today().weekday()]
    print "today's date = " + todays_day_of_week + ', ' + \
                              time.strftime('%Y-%m-%d')

def convert_date(natural_language_date):
    cal = pdt.Calendar()
    (struct_time_date, success) = cal.parse(natural_language_date)
    if success:
        formal_date = time.strftime('%Y-%m-%d', struct_time_date)
    else:
        formal_date = '(conversion failed)'
    print '{0:12s} -> {1:10s}'.format(natural_language_date, formal_date)

print_todays_date()
convert_date('6 months')

Kode di atas menghasilkan yang berikut dari mesin MacOSX:

$ ./parsedatetime_simple.py 
today's date = Wednesday, 2015-05-13
6 months     -> 2015-11-13
$ 
Johnny Utahh
sumber
1

Berikut adalah contoh yang memungkinkan pengguna untuk memutuskan bagaimana mengembalikan tanggal di mana hari lebih besar dari jumlah hari dalam sebulan.

def add_months(date, months, endOfMonthBehaviour='RoundUp'):
    assert endOfMonthBehaviour in ['RoundDown', 'RoundIn', 'RoundOut', 'RoundUp'], \
        'Unknown end of month behaviour'
    year = date.year + (date.month + months - 1) / 12
    month = (date.month + months - 1) % 12 + 1
    day = date.day
    last = monthrange(year, month)[1]
    if day > last:
        if endOfMonthBehaviour == 'RoundDown' or \
            endOfMonthBehaviour == 'RoundOut' and months < 0 or \
            endOfMonthBehaviour == 'RoundIn' and months > 0:
            day = last
        elif endOfMonthBehaviour == 'RoundUp' or \
            endOfMonthBehaviour == 'RoundOut' and months > 0 or \
            endOfMonthBehaviour == 'RoundIn' and months < 0:
            # we don't need to worry about incrementing the year
            # because there will never be a day in December > 31
            month += 1
            day = 1
    return datetime.date(year, month, day)


>>> from calendar import monthrange
>>> import datetime
>>> add_months(datetime.datetime(2016, 1, 31), 1)
datetime.date(2016, 3, 1)
>>> add_months(datetime.datetime(2016, 1, 31), -2)
datetime.date(2015, 12, 1)
>>> add_months(datetime.datetime(2016, 1, 31), -2, 'RoundDown')
datetime.date(2015, 11, 30)
Bruce Jakeway
sumber
1

mengingat bahwa variabel datetime Anda disebut tanggal:

date=datetime.datetime(year=date.year+int((date.month+6)/12),
                       month=(date.month+6)%13 + (1 if (date.month + 
                       months>12) else 0), day=date.day)
blacknight12321
sumber
1

Fungsi umum untuk mendapatkan tanggal berikutnya setelah / sebelum x bulan.

dari tanggal impor datetime

def after_month (diberikan_tanggal, bulan):
    yyyy = int (((given_date.year * 12 + given_date.month) + bulan) / 12)
    mm = int (((diberikan_date.tahun * 12 + diberikan_tanggal.bulan) + bulan)% 12)

    jika mm == 0:
        yyyy - = 1
        mm = 12
    return given_date.replace (tahun = yyyy, bulan = mm)


if __name__ == "__main__":
    hari ini = date.today ()
    print (hari ini)

    untuk mm dalam [-12, -1, 0, 1, 2, 12, 20]:
        next_date = after_month (hari ini, mm)
        cetak (next_date)
Nandlal Yadav
sumber
Ini jelas jawaban terbaik. Sederhana dan efektif, tanpa masalah pembulatan.
jprobichaud
1

Saran cepat adalah Panah

pip pasang panah

>>> import arrow

>>> arrow.now().date()
datetime.date(2019, 6, 28)
>>> arrow.now().shift(months=6).date()
datetime.date(2019, 12, 28)
Diego Magalhães
sumber
0

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?

Devin Jeanpierre
sumber
1
timedelta tidak mendukung bulan dan menghindari jawaban yang mungkin untuk pertanyaan "berapa hari dalam 6 bulan?" Kode Eef akan menetapkan tanggal peninjauan jadi saya akan menyarankan seseorang dapat mempertimbangkan pengaturan timedelta menggunakan hari (6 * 30). Jika periode tersebut mewakili akses klien ke suatu produk / layanan, maka definisi bisnis mungkin diperlukan / disukai.
Carl
0

Inilah yang saya pikirkan. Memindahkan jumlah bulan dan tahun yang benar tetapi mengabaikan hari (yang saya butuhkan dalam situasi saya).

import datetime

month_dt = 4
today = datetime.date.today()
y,m = today.year, today.month
m += month_dt-1
year_dt = m//12
new_month = m%12
new_date = datetime.date(y+year_dt, new_month+1, 1)
marshallpenguin
sumber
0

Saya menggunakan fungsi ini untuk mengubah tahun dan bulan tetapi pertahankan hari:

def replace_month_year(date1, year2, month2):
    try:
        date2 = date1.replace(month = month2, year = year2)
    except:
        date2 = datetime.date(year2, month2 + 1, 1) - datetime.timedelta(days=1)
    return date2

Anda harus menulis:

new_year = my_date.year + (my_date.month + 6) / 12
new_month = (my_date.month + 6) % 12
new_date = replace_month_year(my_date, new_year, new_month)
gt_rocker
sumber
0

Saya pikir akan lebih aman untuk melakukan hal seperti ini daripada menambahkan hari secara manual:

import datetime
today = datetime.date.today()

def addMonths(dt, months = 0):
    new_month = months + dt.month
    year_inc = 0
    if new_month>12:
        year_inc +=1
        new_month -=12
    return dt.replace(month = new_month, year = dt.year+year_inc)

newdate = addMonths(today, 6)
DataGreed
sumber