मेरे पास एक डेटाफ्रेम है जैसा कि नीचे दिखाया गया है। यह इस post< की निरंतरता है। /ए>

df = pd.DataFrame({'person_id': [101,101,101,101,202,202,202],
                   'person_type':['A','A','B','C','D','B','A'],
                   'login_date':['5/7/2013 09:27:00 AM','09/08/2013 11:21:00 AM','06/06/2014 08:00:00 AM','06/06/2014 05:00:00 AM','12/11/2011 10:00:00 AM','13/10/2012 12:00:00 AM','13/12/2012 11:45:00 AM'],
                   'logout_date':[np.nan,'11/08/2013 11:21:00 AM',np.nan,'06/06/2014 05:00:00 AM',np.nan,'13/10/2012 12:00:00 AM',np.nan]})
df.login_date = pd.to_datetime(df.login_date)
df.logout_date = pd.to_datetime(df.logout_date)

मैं logout_date कॉलम में 2 नियम लागू करना चाहता हूं

नियम 1 - यदि व्यक्ति प्रकार बी, सी, डी, ई और लॉगआउट_डेट NaN है, तो लॉगिन तिथि मान की प्रतिलिपि बनाएँ

नियम 2 - यदि व्यक्ति प्रकार A है और logout_date NaN है, तो लॉगिन तिथि में 2 दिन जोड़ें

जब मैं नीचे की कोशिश करता हूँ

m1 = df['person_type'].isin(['B','C','D'])
m2 = df['person_type'].isin(['A'])
m3 = df['logout_datetime'].isna()

df['logout_datetime'] = np.select([m1 & m3, m2 & m3],
                              [df['login_datetime'], df['login_datetime'] + pd.DateOffset(days=2)],
                               default=df['logout_datetime'])
df['logout_date'] = np.select([m1 & m3, m2 & m3],
                              [df['login_datetime'].dt.date, (df['login_datetime'] + pd.DateOffset(days=2)).dt.date],
                               default=df['logout_datetime'])

मैं नमूना कोड में दिखाए गए अनुसार np.select का उपयोग करके सीधे logout_date कॉलम प्राप्त करना चाहता हूं।

वर्तमान में मुझे नीचे जैसा आउटपुट मिलता है जो गलत है

enter image description here

मुझे समझ में नहीं आता क्यों कुछ पंक्तियां समस्याएं पैदा कर रही हैं जबकि अन्य पंक्तियां ठीक काम कर रही हैं।

क्या इसमें मेरी मदद कर सकते हैं? मुझे उम्मीद है कि मेरे आउटपुट में उचित दिनांक मान होंगे

1
The Great 13 जुलाई 2021, 13:18
हाँ, लॉगआउट डेटा में na हो सकता है
 – 
The Great
13 जुलाई 2021, 13:22

1 उत्तर

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

मुझे लगता है कि default पैरामीटर में np.select (default=df['logout_datetime']) में कनवर्ट करने में समस्या गुम है और np.select से लौटाए गए समान प्रकारों के लिए इसे default=df['logout_datetime'].dt.date में बदलें:

df['logout_date'] = np.select([m1 & m3, m2 & m3],
                              [df['login_date'].dt.date, 
                              (df['login_date'] + pd.DateOffset(days=2)).dt.date],
                               default=df['logout_date'].dt.date)
print (df)
   person_id person_type          login_date logout_date
0        101           A 2013-05-07 09:27:00  2013-05-09
1        101           A 2013-09-08 11:21:00  2013-11-08
2        101           B 2014-06-06 08:00:00  2014-06-06
3        101           C 2014-06-06 05:00:00  2014-06-06
4        202           D 2011-12-11 10:00:00  2011-12-11
5        202           B 2012-10-13 00:00:00  2012-10-13
6        202           A 2012-12-13 11:45:00  2012-12-15

अगर default डेटाटाइम के साथ चाहिए तो Series.dt.normalize निकालने का समय (00:00:00 पर सेट) और सभी प्रकार datetimes हैं, इसलिए अच्छी तरह से काम कर रहा है:

df['logout_date'] = np.select([m1 & m3, m2 & m3],
                              [df['login_date'].dt.normalize(), 
                               (df['login_date'] + pd.DateOffset(days=2)).dt.normalize()],
                               default=df['logout_date'])
print (df)
   person_id person_type          login_date         logout_date
0        101           A 2013-05-07 09:27:00 2013-05-09 00:00:00
1        101           A 2013-09-08 11:21:00 2013-11-08 11:21:00
2        101           B 2014-06-06 08:00:00 2014-06-06 00:00:00
3        101           C 2014-06-06 05:00:00 2014-06-06 05:00:00
4        202           D 2011-12-11 10:00:00 2011-12-11 00:00:00
5        202           B 2012-10-13 00:00:00 2012-10-13 00:00:00
6        202           A 2012-12-13 11:45:00 2012-12-15 00:00:00

मूल डेटाटाइम उपयोग के लिए:

df['logout_date'] = np.select([m1 & m3, m2 & m3],
                              [df['login_date'], 
                               (df['login_date'] + pd.DateOffset(days=2))],
                               default=df['logout_date'])
print (df)
   person_id person_type          login_date         logout_date
0        101           A 2013-05-07 09:27:00 2013-05-09 09:27:00
1        101           A 2013-09-08 11:21:00 2013-11-08 11:21:00
2        101           B 2014-06-06 08:00:00 2014-06-06 08:00:00
3        101           C 2014-06-06 05:00:00 2014-06-06 05:00:00
4        202           D 2011-12-11 10:00:00 2011-12-11 10:00:00
5        202           B 2012-10-13 00:00:00 2012-10-13 00:00:00
6        202           A 2012-12-13 11:45:00 2012-12-15 11:45:00
1
jezrael 13 जुलाई 2021, 13:44
भले ही मैं डिफ़ॉल्ट मान के लिए dt.date का उपयोग नहीं करता, इसे केवल डेटाटाइम मान से भरना चाहिए? यह एक इंटरगर से क्यों भरता है?..upvited
 – 
The Great
13 जुलाई 2021, 13:23
- क्योंकि dates और datetimes . के साथ बेमेल है
 – 
jezrael
13 जुलाई 2021, 13:24
- df['login_date'].dt.date वापसी की तारीखें, फिर (df['login_date'] + pd.DateOffset(days=2)).dt.date वापसी dates और default=df['logout_date'] वापसी की तारीखें
 – 
jezrael
13 जुलाई 2021, 13:25
Df['logout_datetime'] के डिफ़ॉल्ट मान के लिए, वास्तविक मान 2014-06-06 08:00:00 को बनाए रखने के बजाय, यह इसे 2014-06-06 00:00:00 कर देता है
 – 
The Great
13 जुलाई 2021, 13:37
- दूसरे पैराग्राफ उत्तर की तरह आउटपुट चाहिए?
 – 
jezrael
13 जुलाई 2021, 13:39