मेरे पास एक df
है,
date1 date2
2019-05-31 2019-06-01
NaT NaN
2018-07-01 2018-08-01
NaT 2019-06-03
2019-01-01 NaN
मैं -3 <= date2 - date1 <= 0
के आधार पर एक बूलियन कॉलम on_time
बनाना चाहता हूं, यदि date1
या date2
में कोई मान NaN
या NaT
है, तो on_time = False
;
a = df['date1'].isna()
b = df['date2'].isna()
df['on_time'] = (a | b)
m = (-3 <= (df.loc[~a&~b, 'date1'] - df.loc[~a&~b, 'date2']).dt.days) & \
((df.loc[~a&~b, 'date1'] - df.loc[~a&~b, 'date2']).dt.days <= 0)
df['on_time'] = m
मैं सोच रहा हूं कि ऐसा करने का कोई बेहतर तरीका है, अधिक संक्षिप्त और कुशल तरीका।
2 जवाब
## if the dates are of type str
df['date1'] = pd.to_datetime(df['date1'])
df['date2'] = pd.to_datetime(df['date2'])
(df['date2'] - df['date1']).apply(lambda x: True if -3<= x.days <=0 else False)
आउटपुट
date1 date2 on_time
0 2019-05-31 2019-06-01 False
1 NaT NaT False
2 2018-07-01 2018-08-01 False
3 NaT 2019-06-03 False
4 2019-01-01 NaT False
IIUC, आप series.dt.days()
और s.ge()
और le
:
s=(df.date2-df.date1).dt.days
df=df.assign(on_time=s.ge(-3)&s.le(0))
date1 date2 on_time
0 2019-05-31 2019-06-01 False
1 NaT NaT False
2 2018-07-01 2018-08-01 False
3 NaT 2019-06-03 False
4 2019-01-01 NaT False
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।