ডেটটাইম পাইথন মডিউলটি ব্যবহার করে বর্তমান তারিখ থেকে ছয় মাসের তারিখটি কীভাবে গণনা করব?


391

আমি ডেটটাইম পাইথন মডিউলটি ব্যবহার করছি। আমি বর্তমান তারিখ থেকে 6 মাস তারিখ গণনা করতে চাই। কেউ আমাকে এই কাজ করতে একটু সহায়তা করতে পারেন?

বর্তমান তারিখ থেকে 6 মাস তারিখের জন্য যে তারিখটি আমি উত্পন্ন করতে চাই তা হচ্ছে একটি পর্যালোচনা তারিখ উত্পাদন করা । যদি ব্যবহারকারী সিস্টেমে ডেটা প্রবেশ করে তবে তারা ডেটা প্রবেশের তারিখ থেকে 6 মাসের পর্যালোচনা তারিখ থাকবে।


2
আপনার আরও নির্দিষ্ট হতে হবে: 31 শে মার্চ থেকে ছয় মাস কখন হয়? এবং আগস্ট 30 থেকে?
kmkaplan

3
হ্যাঁ সম্পাদনাটি সহায়তা করে: এর অর্থ আপনি কোনও খারাপ প্রতিক্রিয়া ছাড়াই 6 মাস থেকে 183 দিন অবধি আনতে পারেন। সুতরাং আজকের দিনে 183 দিন যুক্ত করা কৌশলটি করবে।
কিমিপ্যাপ্লান

15
উপরের মন্তব্যগুলি আমাকে মূর্খ বলে মনে করে। "ছয় মাস যোগ করার" ধারণাটি পুরোপুরি পরিষ্কার - আমরা ডিসেম্বর 6পেরিয়ে গেলে বছর জুড়ে রোলিংয়ের জন্য (এবং মাসকে সাইকেল চালিয়ে 1) সমর্থন সহ মাসের উপাদানটি গ্রহণ করুন এবং এতে যুক্ত হন । এটি ঠিক কী relativedeltaঘটে এবং বাস্তবে এই প্রোগ্রামটির ধারণার জন্য প্রতিটি প্রোগ্রামিং ভাষা সমর্থন করে তা ঘটে।
কर्क ওল

5
@ কির্কওয়াল: আমি নিশ্চিত এটি বেশ পরিষ্কার। তবে যে কথা বলে তার পক্ষে এখনও আলাদা। পাইথন: 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। পিএইচপি: date_create('2000-03-31', new DateTimeZone('UTC'))->add(new DateInterval('P6M'))2000-10-01 দেয়। আপনার বিষ বাছুন।
kmkaplan

2
... 182 যোগ করা পর্যালোচনার তারিখ উত্পন্ন করার জন্য আরও বাস্তববাদী বলে মনে হচ্ছে : এটি সপ্তাহের দিনটি অক্ষত রাখে।
ওল্ফ

উত্তর:


1047

আমি এই সমাধানটি ভাল বলে খুঁজে পেয়েছি। (এটি পাইথন-ডেটুটিল এক্সটেনশন ব্যবহার করে )

from datetime import date
from dateutil.relativedelta import relativedelta

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

এই পদ্ধতির সুবিধাটি হ'ল এটি 28, 30, 31 দিন ইত্যাদির সাথে সম্পর্কিত বিষয়গুলির যত্ন নেয় care এটি ব্যবসায়ের বিধি এবং পরিস্থিতিগুলি পরিচালনা করতে খুব কার্যকর হয়ে উঠেছে (চালান উত্পন্ন প্রজনন ইত্যাদি বলুন))

$ 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 হতে পারে, একই জিনিস দিন এবং বছরগুলিতেও প্রযোজ্য :)
নিরাপদ 25

5
@ স্লাইডার্স_লফা আপনাকে পাইথন-ডেটুটিল প্যাকেজ ইনস্টল করতে হবে (পাইপ ইনস্টল পাইথন-ডেটুটিল)
পোইউইট্রেজ

18
এটিই সঠিক সমাধান। ওপি যদি 6 মাসের পরিবর্তে 6 বছর জিজ্ঞাসা করত তবে অনুমোদিত উত্তরটি খারাপভাবে ব্যর্থ হবে। সুতরাং আপনার মনে রাখা উচিত যে উত্তরগুলি যত বেশি সাধারণ হয় সেগুলি আরও মূল্যবান।
ড্যানিয়েল এফ

3
দয়া করে নোট করুন যে relativedeltaফাংশনটি monthএকটি আর্গুমেন্ট হিসাবে গ্রহণ করে , যা মূলত পাসের তারিখের মধ্যে / সেট / ফিক্সের মাস প্রতিস্থাপন করে, যা আরও মাস যুক্ত করার চেয়ে খুব আলাদা। শুধু ভাবছি যদি ফাংশন নষ্ট হয়ে গেছে, কারণ তারা অতিরিক্ত ভুলে গেছি ভাবেন জন্য একটি forewarning গুলি মধ্যে মাসের
sha0w_wa1k3r

1
আমি কৌতূহলী: এটি কি ডিফল্টরূপে অন্তর্ভুক্ত করা হয়নি তা কেউ জানেন? টাইমডেল্টা 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 সপ্তাহের সংজ্ঞাও ফেলতে পারেন? এটি সবগুলিকে এক জায়গায় রাখতে সহায়তা করে।
এসলট

11
কেবলমাত্র একটি দ্রুত মন্তব্য: আমি মনে করি, মাসের জন্য, সূত্রটি জুনের পরিবর্তে (মাস + 5)% 12 + 1 বি / সি হবে, আপনার সূত্র 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 দিয়ে সমাধানের জন্য স্ক্রোলিং চালিয়ে যান।
নস্টালজ.ইও

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'

এমএক্স.ডেটটাইম সম্পর্কে আরও তথ্য


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

অন্যান্য উত্তরের মতো, আপনাকে "এখন থেকে months মাস" দ্বারা আসলে কী বোঝাতে হবে তা খুঁজে বের করতে হবে। যদি আপনার অর্থ "ভবিষ্যতে ছয় বছরের মাসের মাসের আজকের দিন" হয় তবে এটি করবে:

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 জানুয়ারী + এক মাসের মতো সমস্যার জন্য অ্যাকাউন্ট করে না। সুতরাং আমরা ওপিতে ফিরে যাই - একমাস যুক্ত করে কী বোঝাতে চাইছ? একটি সমাধান আপনি একটি বৈধ দিন না পাওয়া পর্যন্ত ব্যাকট্র্যাক হ'ল, বেশিরভাগ লোক জানার শেষ দিন এবং আরও এক মাস ধরে ফেব্রুয়ারির শেষ দিনের সমান বলে মনে করে This এটি মাসের নেতিবাচক সংখ্যায়ও কাজ করবে। প্রমাণ:

>>> 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 জানুয়ারী + এক মাস" সমস্যাটি স্থির করে: দিন_স_মনেথ = ক্যালেন্ডার.মেনথ্রেঞ্জ (নতুন বছর, নতুন মাস) [1]; newday = মিনিট (d.day, days_in_month); (দিনটি যদি খুব বড় আকারের হয় তবে উদাহরণস্বরূপ 31 ফেব্রুয়ারি থেকে 28 ফেব্রুয়ারী 29-28)
কার্টিস ইয়ালাপ

এটি কেবলমাত্র নতুন বছরটিকে একটি পূর্ণসংখ্যার ডেটা এফ অ্যাডম্যাথস (ডি, এক্স) তে রূপান্তর করে আমার পক্ষে কাজ করেছে: নিউমনথ = (((ড। মমেন্থ - 1) + এক্স)% 12) + 1 নতুন বছর = ডি.ইয়ার + ইন্ট (( (d.month - 1) + x) / 12) ডেটটাইম.ডেট (নতুন বছর, নিউমনথ, ডি.ডে)
মনমিত সিং

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/112 বিজ্ঞাপনটি সংক্ষিপ্ত / দীর্ঘ মাসের জন্য সমস্যার কারণ হতে পারে যদি আপনার তারিখের সাথে পুনরাবৃত্তি ঘটে।


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-০১-৩১ + ১ মাসের মতো কোণার ক্ষেত্রেও কাজ করবে না। :)


3
আপনার কোডে ত্রুটি: new_month % 12হওয়া উচিত (new_month % 12) or 12। অন্যথায় আপনি যদি নভেম্বর এ চেষ্টা করেন তবে আপনি একটি ত্রুটি পাবেন। :)
জর্ডান রিটার

এটি আসলে গৃহীত সমাধানের চেয়ে অনেক পরিষ্কার er এটির জন্য কোনও নতুন আমদানির প্রয়োজন নেই, কেবলমাত্র মৌলিক গণিত
সাইমন পিএ

ডেটটাইম.ডেট ফেরত (বছর + (নতুন_মিনি / 12)), (নতুন_মোনথ% 12) বা 12, দিন)
পেটাম

9

ডেটুটিল প্যাকেজের এ জাতীয় কার্যকারিতা বাস্তবায়ন রয়েছে। তবে সচেতন থাকুন, এটি নিরীহ হবে , যেমন অন্যরা ইতিমধ্যে জানিয়েছে।


ডেটুটিল দুর্দান্ত। এটি ইজি-ইনস্টল দিয়েও ইনস্টল করা যেতে পারে।
সোভিয়েট

চমৎকার। পরামর্শ দেওয়ার জন্য ধন্যবাদ। এটি seemsশ্বর-প্রেরিত বলে মনে হয়।
আয়াজ

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)(বছরটি 2019 সালের নয়, 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

পাইকিউটি 4 এর কিডেট ক্লাসে একটি অ্যাডমোনথস ফাংশন রয়েছে।

>>>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? ভার্টেকের উত্তরে বিল্ডিং আমি এটি করেছি এবং আমি বিশ্বাস করি এটি কার্যকর হয়:

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

জোপে এবং অবৈধ দিনের সংখ্যাগুলি পরিচালনা করার জন্য অ্যাডম্যাথস () সংশোধন করেছেন:

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 মামলায় জোহানেস ওয়েয়ের উত্তর পরিবর্তিত হয়েছে This এটি আমার পক্ষে নিখুঁতভাবে কাজ করে। মাসগুলি ইতিবাচক বা নেতিবাচক হতে পারে।

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 দিনের জন্য কাজ করে না, তাই আরও দৃ solution় সমাধানের প্রয়োজন হয় (যা এত সুন্দর নয় :)):

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

এই উত্তর থেকে , পার্সেটেটটাইম দেখুন । কোড উদাহরণ অনুসরণ। আরও বিশদ: অনেকগুলি প্রাকৃতিক-ভাষার সাথে ইউনিট পরীক্ষা -> 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')

উপরের কোডটি একটি ম্যাকোএসএক্স মেশিন থেকে নিম্নলিখিতগুলি উত্পন্ন করে:

$ ./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 এর পরে_মিনিথ (প্রদত্ত_ তারিখ, মাস):
    yyyy = int ((প্রদত্ত_ তারিখ.ইয়ার * 12 + প্রদত্ত_সীম.মর্থ) + মাস) / 12)
    মিমি = ইনট ((প্রদত্ত_ তারিখ.ইয়ার * 12 + প্রদত্ত_সীম.মর্থ) + মাস)% 12)

    যদি মিমি == 0:
        হ্যাঁ - = 1
        মিমি = 12
    প্রদত্ত_ডেট.রেপস রিটার্ন (বছর = yyyy, মাস = মিমি)


যদি __ নাম__ == "__ মেইন__":
    আজ = তারিখ.আজ আজ ()
    মুদ্রণ (আজ)

    মিমি জন্য [-12, -1, 0, 1, 2, 12, 20] এ:
        পরের_ তারিখ = পরে_মিনি (আজ, মিমি)
        মুদ্রণ (next_date)

এটি পরিষ্কারভাবে সেরা উত্তর। রাউন্ডিং ইস্যু ছাড়াই সহজ এবং কার্যকর।
jprobichaud


0

ডেটটাইম.টোডে () এ ছয় মাসের একটি সময়সীমা যুক্ত করতে পাইথন ডেটটাইম মডিউলটি ব্যবহার করুন।

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

অবশ্যই অবশ্যই জোহানেস ওয়েইসের উত্থাপিত সমস্যাটি সমাধান করতে হবে - 6 মাসের অর্থ কী?


1
টাইমডেল্টা কয়েক মাস সমর্থন করে না এবং তাই "6 মাসের মধ্যে কত দিন?" ইফের কোডটি একটি পর্যালোচনার তারিখ নির্ধারণ করবে তাই আমি পরামর্শ দেব যে কেউ দিন (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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.