डेटाइम पायथन मॉड्यूल का उपयोग करके मैं वर्तमान तिथि से छह महीने की तारीख की गणना कैसे करूं?


391

मैं डेटाटाइम पायथन मॉड्यूल का उपयोग कर रहा हूं। मैं वर्तमान तिथि से 6 महीने की तारीख की गणना करना चाह रहा हूं। क्या कोई मुझे ऐसा करने में थोड़ी मदद दे सकता है?

कारण मैं वर्तमान तिथि से 6 महीने की तारीख उत्पन्न करना चाहता हूं एक समीक्षा तिथि का उत्पादन करना है । यदि उपयोगकर्ता सिस्टम में डेटा दर्ज करता है, तो उसके पास डेटा दर्ज करने की तारीख से 6 महीने की समीक्षा तिथि होगी।


2
आपको और अधिक विशिष्ट होना होगा: मार्च 31 से छह महीने का समय कब होगा? और अगस्त 30 से?
किमीकपलान

3
हां संपादन मदद करता है: इसका मतलब है कि आप 6 महीने से लेकर 183 दिनों तक बिना किसी बुरे प्रभाव के अनुलोम विलोम कर सकते हैं। तो आज से 183 दिन जोड़कर कर लेंगे ट्रिक
किमीकप्लान

15
उपरोक्त टिप्पणियां मुझे मूर्खतापूर्ण बताती हैं। "छह महीने जोड़ने" की अवधारणा काफी स्पष्ट है - अगर हम दिसंबर में जाते हैं, तो 6साल भर में रोलिंग के लिए समर्थन के साथ महीने जोड़ सकते हैं, और महीने भर (और महीने वापस साइकिल चलाने 1) के लिए समर्थन करते हैं। यह वास्तव में वही relativedeltaकरता है जो वास्तव में होता है और वास्तव में इस तरह की अवधारणा के समर्थन के साथ हर प्रोग्रामिंग भाषा क्या करती है।
1830 में किर्क वूल

5
@KirkWoll: मुझे यकीन है कि यह काफी स्पष्ट है। लेकिन फिर भी जो कोई भी बोलता है उसके लिए अलग है। अजगर: date(2015, 3, 31) + relativedelta(months = 6)देता है datetime.date(2015, 9, 30)। पर्ल: DateTime->new(year=>2000, month=>3, day=>31)->add(months=>6)देता है 2000-10-01T00:00:00। Php: date_create('2000-03-31', new DateTimeZone('UTC'))->add(new DateInterval('P6M'))2000-10-01 देता है। अपना ज़हर उठाएं।
किमीकपलान

2
... 182 जोड़ना समीक्षा की तारीख उत्पन्न करने के लिए अधिक व्यावहारिक लगता है : यह सप्ताह के दिन को बरकरार रखता है।
वुल्फ

जवाबों:


1047

मुझे यह उपाय अच्छा लगा। (यह अजगर-डेटॉल विस्तार का उपयोग करता है )

from datetime import date
from dateutil.relativedelta import relativedelta

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

इस दृष्टिकोण का लाभ यह है कि यह 28, 30, 31 दिनों आदि के साथ मुद्दों का ध्यान रखता है। यह व्यावसायिक नियमों और परिदृश्यों (इनवॉइस जनरेशन आदि) से निपटने में बहुत उपयोगी हो जाता है।

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

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

2
+6 एक संकेतक है कि यह -6 हो सकता है, यही बात दिनों और वर्षों के लिए भी लागू होती है :)
Securecurve

5
@ साइलडर्स_लफा आपको अजगर-डेटुतिल पैकेज (पिप इंस्टॉल अजगर-डेटुतिल) स्थापित करने की आवश्यकता है
poiuytrez

18
यह सही उपाय है। अगर ओपी ने 6 महीने के बजाय 6 साल मांगे होते, तो स्वीकृत जवाब बुरी तरह से विफल हो जाता। तो एक को ध्यान में रखना चाहिए कि उत्तर अधिक मूल्यवान हैं वे अधिक सामान्यीकृत हैं।
डेनियल एफ

3
कृपया ध्यान दें कि relativedeltaफ़ंक्शन monthएक तर्क के रूप में भी लेता है , जो मूल रूप से पारित तारीख में / सेट / फिक्स महीने की जगह लेता है, जो अधिक महीनों को जोड़ने की तुलना में बहुत अलग है। यदि फ़ंक्शन टूट जाता है तो लोग आश्चर्यचकित हो जाते हैं क्योंकि वे महीनों में अतिरिक्त s को भूल जाते हैं ।
shad0w_wa1k3r

1
मैं उत्सुक हूं: क्या कोई जानता है कि यह डिफ़ॉल्ट रूप से शामिल क्यों नहीं है? Timedelta datetimeडिफ़ॉल्ट रूप से पैक किया गया लगता है । मैंने वास्तव में मान लिया था कि मैं "महीनों" को टाइमडेल्टा में पारित कर सकता हूं।
dTanMan

51

ठीक है, यह इस बात पर निर्भर करता है कि वर्तमान तारीख से आपका 6 महीने का क्या मतलब है।

  1. प्राकृतिक महीनों का उपयोग करना:

    (day, month, year) = (day, (month + 5) % 12 + 1, year + (month + 5)/12)
  2. बैंकर की परिभाषा का उपयोग करते हुए, 6 * 30:

    date += datetime.timedelta(6 * 30)

3
क्या आप आधे साल की परिभाषा (183 दिन) और 26 सप्ताह की परिभाषा में भी फेंक सकते हैं? यह उन सभी को एक स्थान पर रखने में मदद करता है।
S.Lott

11
बस एक त्वरित टिप्पणी: मुझे लगता है कि, महीने के लिए, सूत्र इसके बजाय (महीने + 5)% 12 + 1 b / c जून के लिए होगा, आपका सूत्र 0 देता है जबकि अपेक्षित परिणाम 12 है ... इस छोटी सी त्रुटि के बावजूद, मेरा दिमाग, आपका जवाब वही है जो इस सवाल का सबसे अच्छा जवाब देता है
पियरोज

3
और वर्ष के लिए समान: यह वर्ष + (माह + 5) / 12 होना चाहिए
पियरोज़

7
क्या होगा अगर तारीख 31 है, और छह महीने बाद 31 दिन नहीं हो सकते (जो कि 31 दिनों के साथ सबसे अधिक महीनों के लिए मामला है)?
akv

4
डाउनवोट क्योंकि पहला समाधान (day, month, year) = (day, (month+6)%12, year+(month+6)/12)छोटी गाड़ी हो सकता है, क्योंकि यह अमान्य तिथियों को उत्पन्न करता है जैसे (31, 8, 2015)->(31, 2, 2016)
ओह

37

पायथन 3.x के साथ आप इसे इस तरह से कर सकते हैं:

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

लेकिन आपको अजगर-डेटॉल मॉड्यूल स्थापित करने की आवश्यकता होगी :

pip install python-dateutil

उपविभाजितpip install ...
नाथन

मैं सुझा दूंगा from dateutil.relativedelta import relativedelta। उपयोग import *स्पष्ट नहीं है।
सैम मॉर्गन

19

महीने की शुरुआत से लेकर गणना तक:

from datetime import timedelta
from dateutil.relativedelta import relativedelta

end_date = start_date + relativedelta(months=delta_period) + timedelta(days=-delta_period)

18
यह टिप्पणियों में ऊपर उल्लिखित सापेक्षता समाधान नहीं है। 600+ upvotes के साथ समाधान के लिए स्क्रॉल करते रहें।
Nostalg.io

15

"6 महीने" से आपका क्या मतलब है?

क्या 2009-02-13 + 6 महीने == 2009-08-13? या यह 2009-02-13 + 6 * 30 दिन है?

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'

Mx.DateTime के बारे में अधिक जानकारी


14

तो, यहाँ एक उदाहरण है, dateutil.relativedeltaजिसे मैंने पिछले वर्ष के माध्यम से पुनरावृत्ति के लिए उपयोगी पाया, वर्तमान समय में हर बार एक महीने को छोड़ दिया:

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

अन्य उत्तरों के साथ, आपको यह पता लगाना होगा कि वास्तव में "अब से 6 महीने" आपके द्वारा क्या मतलब है। यदि आप "भविष्य में महीने के छह महीने में आज का दिन" का अर्थ करते हैं, तो यह होगा:

datetime.datetime.now() + relativedelta(months=6)

14

यह समाधान दिसंबर के लिए सही ढंग से काम करता है, जो इस पृष्ठ पर अधिकांश उत्तर नहीं देता है। आपको पहले मापांक (%) या पूर्णांक विभाजन (//) का उपयोग करने से पहले आधार 1 (यानी जनवरी = 1) से आधार 0 (यानी जनवरी = 0) तक महीनों को स्थानांतरित करने की आवश्यकता है, अन्यथा नवंबर (11) प्लस 1 महीना आपको 12 देता है , जो शेष (12% 12) को खोजने पर 0 देता है।

(और न ही सुझाव दें "(महीने% 12) + 1" या अक्टूबर + 1 = दिसंबर!)

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)

हालाँकि ... यह 31 जनवरी + एक महीने जैसी समस्या के लिए नहीं है। तो हम वापस ओपी पर जाते हैं - एक महीने को जोड़ने से आपका क्या मतलब है? एक समाधान यह है कि जब तक आप वैध दिन तक नहीं पहुंचते तब तक पीछे हटना होगा, यह देखते हुए कि अधिकांश लोग जून के अंतिम दिन को मानेंगे, साथ ही एक महीने, फरवरी के आखिरी दिन के बराबर होगा। यह महीनों की नकारात्मक संख्या पर भी काम करेगा। सबूत:

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

3
"31 जनवरी + एक महीने" की समस्या को ठीक करता है: days_in_month = Calendar.monthrange (newyear, newmonth) [1]; newday = min (d.day, days_in_month); (दिन ढल जाता है यदि बहुत बड़ा जैसे 31 फरवरी से 28 फरवरी 29 तक)
कर्टिस यलोप

इसने मेरे लिए केवल एक पूर्णांक डेटा प्रकार डी एड Adds (डी, एक्स) को नया रूपांतरित करके मेरे लिए काम किया: newmonth = (((d.month - 1) + x)% 12) + 1 newyear = d'ear + int (() (d.month - 1) + x) / १२) वापसी डेटटाइम करें। (newyear, newmonth, d.day)
मनमीत सिंह

12

मुझे पता है कि यह 6 महीने के लिए था, लेकिन अगर आप एक महीने जोड़ रहे हैं, तो जवाब "google में अजगर जोड़ने के महीने" के लिए दिखाया गया है:

import calendar

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

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

यह चालू माह में दिनों की गणना करेगा और उन्हें वर्तमान तिथि में जोड़ देगा, 365/12 का उपयोग करके एक वर्ष के 1/12 विज्ञापन छोटे / लंबे महीनों के लिए समस्याएँ पैदा कर सकते हैं यदि आपका तारीख पर चलना।


11

पाइथन के डेटाइम के साथ ऐसा करने का कोई सीधा तरीका नहीं है।

पायथन-डेटुटिल पर रिलेटिवेल्टा टाइप की जाँच करें । यह आपको महीनों में एक समय डेल्टा निर्दिष्ट करने की अनुमति देता है।


10

बस समय निकालने के लिए समय- सारणी विधि का उपयोग करें, अपने महीने जोड़ें और एक नया डेटोबजेक्ट बनाएं। अगर इसके लिए पहले से ही कोई मौजूदा तरीका है तो मुझे इसकी जानकारी नहीं है।

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)

एपीआई थोड़ा अनाड़ी है, लेकिन एक उदाहरण के रूप में काम करता है। भी स्पष्ट रूप से 2008-01-31 + 1 महीने जैसे कोने-मामलों पर काम नहीं करेगा। :)


3
आपके कोड में त्रुटि: new_month % 12होनी चाहिए (new_month % 12) or 12। अन्यथा यदि आप नवंबर में यह कोशिश करते हैं तो आपको एक त्रुटि मिलेगी। :)
जॉर्डन रीटर

यह वास्तव में स्वीकृत समाधान की तुलना में बहुत अधिक स्वच्छ है। इसके लिए किसी भी नए आयात की आवश्यकता नहीं है, बस बेसिक मैथ्स
सिमोन पीए

वापसी datetime.date (वर्ष + (new_month / / 12), (new_month% 12) या 12, दिन)
paytam

9

दिनांकित पैकेज में ऐसी कार्यक्षमता का कार्यान्वयन है। लेकिन ध्यान रहे, कि यह अनुभवहीन होगा , जैसा कि अन्य ने पहले ही बताया था।


खजूर कमाल है। इसे easy_install के साथ भी इंस्टॉल किया जा सकता है।
सोवियुत

अति उत्कृष्ट। सुझाव देने के लिए धन्यवाद। लगता है कि ईश्वर-भेजा हुआ है।
अयाज

9

पायथन मानक पुस्तकालयों का उपयोग करना, अर्थात बिना dateutilया अन्य, और '31 फरवरी' की समस्या को हल करना:

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

परिक्षण:

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

इसके पास एक बग है: यदि लक्ष्य महीना दिसंबर है, तो यह एक साल बाद की तारीख की आवश्यकता के बाद वापस आ जाएगा। उदाहरण: add_months(datetime.date(2018, 11, 30), 1)रिटर्न datetime.date(2019, 12, 30)(वर्ष 2018 होना चाहिए, 2019 नहीं)। तो, बेहतर इसके लिए एक समर्पित, अच्छी तरह से परीक्षण की गई लाइब्रेरी का उपयोग करें! यदि आपको वास्तव में केवल मानक पुस्तकालय मॉड्यूल का उपयोग करने की आवश्यकता है, तो एक समान प्रश्न का मेरा उत्तर देखें ।
कथावाचक

5

मेरे पास '31 फरवरी' समस्या को हल करने का एक बेहतर तरीका है:

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)

मुझे लगता है कि यह नकारात्मक संख्या (महीनों को घटाने के लिए) के साथ भी काम करता है, लेकिन मैंने इसका बहुत परीक्षण नहीं किया है।


1
इस उत्तर में केवल अंतर्निहित पायथन पुस्तकालयों का उपयोग करके समस्या को सही ढंग से हल करने का गुण है। समतुल्य लेकिन थोड़ा अधिक संक्षिप्त उत्तर के लिए stackoverflow.com/a/4131114/302264 की जाँच करें।
एडुआर्डो डोबे

3

PyQt4 के QDate वर्ग में एक ऐडमाउथ्स फ़ंक्शन है।

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

3

इस बारे में कैसा है? अन्य पुस्तकालय ( dateutil) का उपयोग नहीं कर रहे हैं timedelta? vartec के उत्तर पर निर्माण मैंने यह किया है और मेरा मानना ​​है कि यह काम करता है:

import datetime

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

मैंने उपयोग करने की कोशिश की timedelta, लेकिन क्योंकि यह दिनों की गिनती कर रहा है, 365/2या 6*356/12हमेशा 6 महीने तक अनुवाद नहीं करता है, बल्कि 182 दिनों का होता है। जैसे

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

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

मेरा मानना ​​है कि हम आम तौर पर मानते हैं कि एक निश्चित दिन से 6 महीने महीने के एक ही दिन पर उतरेंगे, लेकिन 6 महीने बाद (यानी 2015-03-10-> 2015-09-10, नहीं 2015-09-08)

मुझे उम्मीद है कि आप इस मददगार को खोज लेंगे।


1
day + datetime.timedelta(6*365/12)हमेशा काम नहीं करेंगे, क्योंकि कुछ वर्षों में 365 दिन हैं और अन्य में 366 दिन हैं।
3kstc

3

यह विशिष्ट प्रश्न ( datetimeकेवल का उपयोग करके ) का जवाब नहीं देता है , लेकिन यह देखते हुए कि अन्य ने विभिन्न मॉड्यूल के उपयोग का सुझाव दिया है, यहां एक समाधान का उपयोग किया गया है 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

जो कि लीप वर्षों में अपेक्षित रूप से काम करता है

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

2019-02-28 00:00:00

2

Zope में उपयोग के लिए AddMonths () संशोधित और अमान्य दिन संख्याओं को संभालना:

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)

यह लीप वर्ष (फेब में 29 दिन) पर विचार नहीं करता है।
संभाल

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

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

1

मामले में संशोधित जोहान्स वी का जवाब 1new_month = 121। यह मेरे लिए पूरी तरह से काम करता है। महीने सकारात्मक या नकारात्मक हो सकते हैं।

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)

2
यह "पूरी तरह से काम नहीं करता है" जब प्रारंभ तिथि में दिन लक्ष्य महीने में दिनों की संख्या से अधिक होता है। उदाहरण: 2001-01-31 प्लस एक महीना 2001-02-31 की तारीख बनाने की कोशिश करता है।
जॉन मैकिन

1

फिर भी एक और समाधान - आशा है कि कोई इसे पसंद करेगा:

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

यह समाधान सभी मामलों के लिए 29,30,31 दिनों के लिए काम नहीं करता है, इसलिए अधिक मजबूत समाधान की आवश्यकता है (जो अब इतना अच्छा नहीं है :)):

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

1

से इस उत्तर , देख parsedatetime । कोड उदाहरण इस प्रकार है। अधिक विवरण: कई प्राकृतिक-भाषा के साथ इकाई परीक्षण -> YYYY-MM-DD रूपांतरण उदाहरण , और स्पष्ट पार्सडाइमटाइम रूपांतरण चुनौतियाँ / कीड़े

#!/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')

उपरोक्त कोड MacOSX मशीन से निम्नलिखित उत्पन्न करता है:

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

1

यहां एक उदाहरण है जो उपयोगकर्ता को यह तय करने की अनुमति देता है कि उस तारीख को कैसे वापस किया जाए जहां दिन महीने में दिनों की संख्या से अधिक है।

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)

1

यह देखते हुए कि आपके डेटाटाइम चर को दिनांक कहा जाता है:

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)

1

एक्स महीनों के बाद / उससे पहले अगली तारीख पाने के लिए सामान्य कार्य।

डेटाइम आयात तिथि से

def_month (दिए गए_डेट, माह):
    yyyy = int (((दिया_अध्याय * १२ + दिया_दाते) माह) + महीना) / १२)
    mm = int (((दिया_डेट। * * 12 + दिया_डेटा) + माह)% 12)

    यदि मिमी == 0:
        य्येय - = १
        मिमी = 12
    दिए गए रिटर्न_टेट .replace (वर्ष = yyyy, महीना = मिमी)


अगर __name__ == "__main__":
    आज = date.today ()
    प्रिंट (आज)

    [-12, -1, 0, 1, 2, 12, 20] में मिमी के लिए:
        अगला_डेट = after_month (आज, मिमी)
        प्रिंट (next_date)

यह स्पष्ट रूप से सबसे अच्छा जवाब है। गोल मुद्दों के बिना सरल और प्रभावी।
ज्रपबिचौड


0

डेटाइम.टोडे () में छह महीने का टाइमडेलटा जोड़ने के लिए अजगर डेटाइम मॉड्यूल का उपयोग करें।

http://docs.python.org/library/datetime.html

आप निश्चित रूप से जोहान्स वेई द्वारा उठाए गए मुद्दे को हल करना होगा-- 6 महीने से आपका क्या मतलब है?


1
टाइमडेल्टा महीनों का समर्थन नहीं करता है और इसलिए प्रश्न के संभावित उत्तरों को "6 महीने में कितने दिन?" Eef का कोड एक समीक्षा तिथि निर्धारित करेगा ताकि मैं सुझाव दूं कि कोई व्यक्ति दिन (6 * 30) का उपयोग करके समयसीमा निर्धारित करने पर विचार कर सकता है। यदि अवधि किसी उत्पाद / सेवा के लिए ग्राहकों की पहुंच का प्रतिनिधित्व करती है तो एक व्यावसायिक परिभाषा की आवश्यकता हो सकती है।
कार्ल

0

मैंने ये ढूंढ निकाला। यह महीनों और वर्षों की सही संख्या को आगे बढ़ाता है लेकिन दिनों की उपेक्षा करता है (जो मुझे अपनी स्थिति में चाहिए था)।

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)

0

मैं इस फ़ंक्शन का उपयोग वर्ष और महीने बदलने के लिए करता हूं लेकिन दिन रखता हूं:

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

आपको लिखना चाहिए:

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)

0

मुझे लगता है कि मैन्युअल रूप से दिनों को जोड़ने के बजाय ऐसा कुछ करना सुरक्षित होगा:

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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.