नीचे दिए गए pandas डेटाफ़्रेम उदाहरण में, MyDate में महीने का पहला दिन और आखिरी कारोबारी दिन< शामिल हैं /strong> महीने का। डेटासेट हमेशा (current month - 1) के पहले नंबर पर चलेगा।

मैं गतिशील रूप से MyDate को एक महीने तक बढ़ाना चाहता हूं। हालांकि ऐसा करने में, अंतिम कार्य दिवस अब सही नहीं है। जैसे, मैं अद्यतन महीने के आधार पर अंतिम व्यावसायिक दिन की गणना भी करना चाहूंगा।

इनपुट:

MyDate       MyValue 
31/Mar/2020  0
01/Apr/2020  a
30/Apr/2020  b
01/May/2020  c
29/May/2020  d <<< note 29 May - last workday of month
01/Jun/2020  e
30/Jun/2020  f
01/Jul/2020  g
31/Jul/2020  h
01/Aug/2020  i

वांछित आउटपुट:

MyDate       MyValue 
30/Apr/2020  0
01/May/2020  a
29/May/2020  b <<< note 29 May - last workday of month
01/Jun/2020  c
30/Jun/2020  d 
01/Jul/2020  e
31/Jul/2020  f
01/Aug/2020  g
31/Aug/2020  h
01/Sep/2020  i

मैंने समस्या को दो भागों में विभाजित किया है:

  1. month को month+1 में बदलें - relativedelta का उपयोग करके
  2. pd.offsets.BMonthEnd() का उपयोग करके - बदले हुए महीने के लिए अंतिम कार्यदिवस प्राप्त करें

, लेकिन किसी तरह मैं # 2 पर फंस गया हूं, हालांकि मैंने स्टैक ओवरफ्लो पर पोस्ट किए गए समान समाधानों का प्रयास किया है।

यह मेरा कोड है:

import pandas as pd
from dateutil.relativedelta import relativedelta

...
# this solves part #1
df['MyDate']=df['MyDate'].dt.date + relativedelta(months=+1)

# attempt at solving part 2
df['MyDate']=pd.to_datetime(df['MyDate'])

mask = df['MyDate'].dt.day > 1
df.loc[mask, 'MyDate'] = df['MyDate'] + pd.offsets.BMonthEnd(1)

आखिरी पंक्ति वह है जहां मैं फंस गया हूं; जाहिर है यह उन परिणामों को उत्पन्न नहीं करता है जो मैंने सोचा था कि यह होगा ...

इसे हल करने में कोई मदद, या पूरी तरह से समस्या को हल करने के लिए एक अलग "पांडा-एस्क्यू" दृष्टिकोण की सराहना की जाएगी।

1
0buz 2 सितंबर 2020, 20:14

1 उत्तर

सबसे बढ़िया उत्तर

आप अपने MyDate कॉलम में बिजनेस-माह-समाप्ति तिथियों की पहचान करने के लिए एक बूलियन मास्क बना सकते हैं (व्यावसायिक-माह-समाप्ति तिथियां रिटर्न True, अन्य रिटर्न False)। 1 महीने की शुरुआत और 1 बिजनेस-महीने के अंत को अलग-अलग जोड़ने के लिए इस मास्क का उपयोग करें

m = df.MyDate == (df.MyDate + pd.offsets.BMonthEnd(0))
df.loc[m, 'MyDate']  = df.loc[m, 'MyDate'] +  pd.offsets.BMonthEnd(1)
df.loc[~m, 'MyDate'] = df.loc[~m, 'MyDate'] +  pd.offsets.MonthBegin(1)

print(df)

Output:
      MyDate MyValue
0 2020-04-30       0
1 2020-05-01       a
2 2020-05-29       b
3 2020-06-01       c
4 2020-06-30       d
5 2020-07-01       e
6 2020-07-31       f
7 2020-08-01       g
8 2020-08-31       h
9 2020-09-01       i

नोट: मुझे लगता है कि आपका MyDate कॉलम पहले से ही dtype: datetime64[ns] में है

2
Andy L. 2 सितंबर 2020, 20:59