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


Answers

मुझे यह समाधान अच्छा लगता है। (यह पायथन-डेटुटिल एक्सटेंशन का उपयोग करता है)

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

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

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




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

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)



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

from datetime import date

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

    if mm == 0:
        yyyy -= 1
        mm = 12
    return given_date.replace(year=yyyy, month=mm)


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

    for mm in [-12, -1, 0, 1, 2, 12, 20 ]:
        next_date = after_month(today, mm)
        print(next_date)



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

import datetime

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

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

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

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

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

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




यह समाधान दिसम्बर के लिए सही तरीके से काम करता है, जो इस पृष्ठ पर अधिकांश उत्तरों नहीं करता है। मॉड्यूलस (%) या पूर्णांक विभाजन (//) का उपयोग करने से पहले आपको पहले बेस 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  = 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)>>> 



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

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)



उपयोगकर्ता 417751 द्वारा पहले के जवाब का कार्यवाही। शायद इतना पाइथनिक तरीका नहीं है, लेकिन यह विभिन्न महीने की लंबाई और लीप वर्षों का ख्याल रखता है। इस मामले में 31 जनवरी 2012 + 1 महीने = 2 9 फरवरी 2012।

import datetime
import calendar

def add_mths(d, x):
    newday = d.day
    newmonth = (((d.month - 1) + x) % 12) + 1
    newyear  = d.year + (((d.month - 1) + x) // 12)
    if newday > calendar.mdays[newmonth]:
        newday = calendar.mdays[newmonth]
        if newyear % 4 == 0 and newmonth == 2:
            newday += 1
    return datetime.date(newyear, newmonth, newday)



तो, यहां dateutil.relativedelta का एक उदाहरण है जिसे मैंने पिछले वर्ष के माध्यम से 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)



मामले 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)



एक अन्य समाधान: अगले महीने के लिए महीने में दिनों की गणना की गणना करें और वर्तमान तिथि में परिणाम जोड़ें।

import calendar
import datetime

def date_from_now(months):
    today = datetime.datetime.today()

    month = today.month
    year = today.year
    sum_days = 0

    for i in range(int(months)):
        month += 1

        if month == 13:
            month = 1
            year += 1

        sum_days += calendar.monthrange(year, month)[1]

    return datetime.date.today() + datetime.timedelta(sum_days)

print(date_from_now(12)) # if to day is 2017-01-01, output: 2019-01-01 



ज़ोप में उपयोग के लिए 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)



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

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

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

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



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

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




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

from datetime import timedelta
from dateutil.relativedelta import relativedelta

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



मुझे पता है कि यह 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 विज्ञापन साल के दौरान पुन: प्रारंभ होने पर छोटे / लंबे महीने के लिए मुद्दों का कारण बन सकता है।






Related