python - पायथन के साथ दी गई तिथि(गोल दिन के बाद)में एक महीने जोड़ें




pandas calendar timedelta python-dateutil (4)

त्वरित समाधान:

import datetime
import calendar
dt = datetime.datetime(year=2014, month=5, day=2)
d = calendar.monthrange(dt.year,dt.month+1)[1] 
print dt+datetime.timedelta(days=d+1)

पहले इनपुट के लिए आउटपुट (year=2014, month=5, day=2) :

2014-06-02 00:00:00

दूसरे इनपुट के लिए आउटपुट (year=2015, month=1, day=31) :

2015-03-01 00:00:00

मैं एक तारीख को एक तारीख को जोड़ना चाहता हूं

import datetime
dt = datetime.datetime(year=2014, month=5, day=2)

इसलिए मुझे मिलना चाहिए

datetime.datetime(year=2014, month=6, day=2)

लेकिन इसके साथ

dt = datetime.datetime(year=2015, month=1, day=31)

मुझे मिलना चाहिए

datetime.datetime(year=2015, month=3, day=1)

क्योंकि कोई 2015-02-31 नहीं है (और मैं चाहता हूं कि मेरा परिणाम एक दिन बाद गोल हो )

कुछ महीनों में 31 दिन, कुछ अन्य 30, कुछ 29, कुछ 28!

इसलिए एक datetime.timedelta जोड़ना शायद एक अच्छा तरीका नहीं है (क्योंकि हमें जोड़ने की संख्या की संख्या नहीं पता है)

मैंने देखा कि पांडा की DateOffset की एक दिलचस्प अवधारणा है

http://pandas.pydata.org/pandas-docs/stable/timeseries.html#dateoffset-objects

लेकिन मुझे कोई Month ऑफसेट नहीं मिला, बस Month या MonthEnd

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

इसलिए मैंने dateutil.relativedelta की कोशिश की लेकिन

from dateutil.relativedelta import relativedelta
datetime.datetime(year=2015, month=1, day=31)+relativedelta(months=1)

रिटर्न

datetime.datetime(2015, 2, 28, 0, 0)

तो परिणाम एक दिन पहले गोल हो गया था।

क्या दिन के बाद गोल करने के लिए एक (स्वच्छ) तरीका है?

संपादित करें: मैं एक महीने के साथ एक उदाहरण देता हूं, लेकिन मैं भी उदाहरण के लिए जोड़ना चाहता हूं: 2 साल और 6 महीने (एक relativedelta(years=2, months=6) )


आप dateutil.relativedelta.relativedelta उपयोग कर सकते हैं और मैन्युअल रूप से datetime.day विशेषता की जांच कर सकते हैं, यदि मूल दिन नए दिन से अधिक है, तो एक दिन जोड़ें।

नीचे दिया गया फ़ंक्शन एक datetime ऑब्जेक्ट और relativedelta ऑब्जेक्ट स्वीकार करता है। ध्यान दें कि नीचे दिए गए कोड केवल वर्षों और महीनों के लिए ही काम करता है, मेरा मानना ​​नहीं है कि यदि आप उस चीज़ के नीचे कुछ (दिन, घंटे, आदि) का उपयोग करते हैं तो यह काम करेगा। आप इस फ़ंक्शन को आसानी से years और months को तर्क के रूप में लेने के लिए संशोधित कर सकते हैं और फ़ंक्शन के अंदर relativedelta निर्माण कर सकते हैं।

from datetime import datetime
from dateutil.relativedelta import relativedelta

def add_time(d, rd):
    day = relativedelta(days=+1)

    out = d + rd
    if d.day > out.day:
        out = out + day

    return out    

# Check that it "rolls over"
print(add_time(datetime(year=2015, month=1, day=29), relativedelta(years=+4, months=+1))) # 2019-03-01 00:00:00
print(add_time(datetime(year=2015, month=3, day=31), relativedelta(years=+0, months=+2))) # 2015-05-01 00:00:00

# Check that it handles "normal" scenarios
print(add_time(datetime(year=2015, month=6, day=19), relativedelta(months=+1))) # 2015-07-19 00:00:00
print(add_time(datetime(year=2015, month=6, day=30), relativedelta(years=+2, months=+1))) # 2017-07-30 00:00:00

# Check across years
print(add_time(datetime(year=2015, month=12, day=25), relativedelta(months=+1))) # 2016-01-25 00:00:00

# Check leap years
print(add_time(datetime(year=2016, month=1, day=29), relativedelta(years=+4, months=+1))) # 2020-02-29 00:00:00

यह काम करने लगता है यह काफी साफ है, लेकिन सुंदर नहीं है:

def add_month(now):
    try:
        then = (now + relativedelta(months=1)).replace(day=now.day)
    except ValueError:
        then = (now + relativedelta(months=2)).replace(day=1)
    return then

for now in [datetime(2015, 1, 20), datetime(2015, 1, 31), datetime(2015, 2, 28)]:
    print now, add_month(now)

प्रिंट:

2015-01-20 00:00:00 2015-02-20 00:00:00
2015-01-31 00:00:00 2015-03-01 00:00:00
2015-02-28 00:00:00 2015-03-28 00:00:00

यह एक महीने जोड़ता है और दिन को मूल दिन के साथ बदलने की कोशिश करता है। यदि यह सफल होता है, तो यह कोई विशेष मामला नहीं है। यदि यह विफल हो जाता है (मानएर्रर), तो हमें एक और महीने जोड़ना होगा और पहले दिन पर जाना होगा।


एक बहुत ही सरल समाधान है:

day_of_year = datetime.now().timetuple().tm_yday






python pandas calendar timedelta python-dateutil