2016-06-15 5 views
7

मेरे पास पांडस डेटा फ्रेम में दो कॉलम हैं जो तिथियां हैं।पांडा: दो दिनांक कॉलम घटाना और परिणाम एक पूर्णांक

मैं एक कॉलम को दूसरे से घटाना चाहता हूं और परिणाम को एक पूर्णांक के रूप में अंतर में अंतर होता है।

डेटा पर एक नज़र:

df_test['Difference'] = df_test['First_Date'].sub(df_test['Second Date'], axis=0) 
df_test.head()   
Out[22]: 
    First_Date Second Date Difference 
0 2016-02-09 2015-11-19  82 days 
1 2016-01-06 2015-11-30  37 days 
2  NaT 2015-12-04   NaT 
3 2016-01-06 2015-12-08  29 days 
4  NaT 2015-12-09   NaT 

हालांकि मैं परिणाम के एक अंकीय संस्करण प्राप्त करने में असमर्थ हूँ:

df_test.head(10) 
Out[20]: 
    First_Date Second Date 
0 2016-02-09 2015-11-19 
1 2016-01-06 2015-11-30 
2  NaT 2015-12-04 
3 2016-01-06 2015-12-08 
4  NaT 2015-12-09 
5 2016-01-07 2015-12-11 
6  NaT 2015-12-12 
7  NaT 2015-12-14 
8 2016-01-06 2015-12-14 
9  NaT 2015-12-15 

मैं अंतर के साथ सफलतापूर्वक एक नया स्तंभ बनाया है

df_test['Difference'] = df_test[['Difference']].apply(pd.to_numeric)  

df_test.head() 
Out[25]: 
    First_Date Second Date Difference 
0 2016-02-09 2015-11-19 7.084800e+15 
1 2016-01-06 2015-11-30 3.196800e+15 
2  NaT 2015-12-04   NaN 
3 2016-01-06 2015-12-08 2.505600e+15 
4  NaT 2015-12-09   NaN 

उत्तर

7

आप dtypetimedelta के कॉलम कोसे विभाजित कर सकते हैं

df_test['Difference'] = df_test['Difference']/np.timedelta64(1, 'D') 
print (df_test) 
    First_Date Second Date Difference 
0 2016-02-09 2015-11-19  82.0 
1 2016-01-06 2015-11-30  37.0 
2  NaT 2015-12-04   NaN 
3 2016-01-06 2015-12-08  29.0 
4  NaT 2015-12-09   NaN 
5 2016-01-07 2015-12-11  27.0 
6  NaT 2015-12-12   NaN 
7  NaT 2015-12-14   NaN 
8 2016-01-06 2015-12-14  23.0 
9  NaT 2015-12-15   NaN 

Frequency conversion:, लेकिन उत्पादन, क्योंकि NaN valuesint नहीं है, लेकिन float है।

5

आप यहां सहायता के लिए डेटाटाइम मॉड्यूल का उपयोग कर सकते हैं। इसके अलावा, एक पक्ष नोट के रूप में, एक सरल तारीख घटाव के रूप में नीचे काम करना चाहिए:

import datetime as dt 
import numpy as np 
import pandas as pd 

#Assume we have df_test: 
In [222]: df_test 
Out[222]: 
    first_date second_date 
0 2016-01-31 2015-11-19 
1 2016-02-29 2015-11-20 
2 2016-03-31 2015-11-21 
3 2016-04-30 2015-11-22 
4 2016-05-31 2015-11-23 
5 2016-06-30 2015-11-24 
6   NaT 2015-11-25 
7   NaT 2015-11-26 
8 2016-01-31 2015-11-27 
9   NaT 2015-11-28 
10  NaT 2015-11-29 
11  NaT 2015-11-30 
12 2016-04-30 2015-12-01 
13  NaT 2015-12-02 
14  NaT 2015-12-03 
15 2016-04-30 2015-12-04 
16  NaT 2015-12-05 
17  NaT 2015-12-06 

In [223]: df_test['Difference'] = df_test['first_date'] - df_test['second_date'] 

In [224]: df_test 
Out[224]: 
    first_date second_date Difference 
0 2016-01-31 2015-11-19  73 days 
1 2016-02-29 2015-11-20 101 days 
2 2016-03-31 2015-11-21 131 days 
3 2016-04-30 2015-11-22 160 days 
4 2016-05-31 2015-11-23 190 days 
5 2016-06-30 2015-11-24 219 days 
6   NaT 2015-11-25   NaT 
7   NaT 2015-11-26   NaT 
8 2016-01-31 2015-11-27  65 days 
9   NaT 2015-11-28   NaT 
10  NaT 2015-11-29   NaT 
11  NaT 2015-11-30   NaT 
12 2016-04-30 2015-12-01 151 days 
13  NaT 2015-12-02   NaT 
14  NaT 2015-12-03   NaT 
15 2016-04-30 2015-12-04 148 days 
16  NaT 2015-12-05   NaT 
17  NaT 2015-12-06   NaT 

अब, datetime.timedelta को परिवर्तन प्रकार, और उसके बाद वैध timedelta वस्तुओं पर .days विधि का उपयोग करें।

In [226]: df_test['Diffference'] = df_test['Difference'].astype(dt.timedelta).map(lambda x: np.nan if pd.isnull(x) else x.days) 

In [227]: df_test 
Out[227]: 
    first_date second_date Difference Diffference 
0 2016-01-31 2015-11-19  73 days   73 
1 2016-02-29 2015-11-20 101 days   101 
2 2016-03-31 2015-11-21 131 days   131 
3 2016-04-30 2015-11-22 160 days   160 
4 2016-05-31 2015-11-23 190 days   190 
5 2016-06-30 2015-11-24 219 days   219 
6   NaT 2015-11-25   NaT   NaN 
7   NaT 2015-11-26   NaT   NaN 
8 2016-01-31 2015-11-27  65 days   65 
9   NaT 2015-11-28   NaT   NaN 
10  NaT 2015-11-29   NaT   NaN 
11  NaT 2015-11-30   NaT   NaN 
12 2016-04-30 2015-12-01 151 days   151 
13  NaT 2015-12-02   NaT   NaN 
14  NaT 2015-12-03   NaT   NaN 
15 2016-04-30 2015-12-04 148 days   148 
16  NaT 2015-12-05   NaT   NaN 
17  NaT 2015-12-06   NaT   NaN 

आशा है कि मदद करता है।

+0

हां, यह एक संभावित समाधान है, लेकिन मुझे लगता है कि यह अनुशंसित दृष्टिकोण नहीं है, क्योंकि कॉलम 'डिफेंसेंस' का आउटपुट 'ऑब्जेक्ट' है और अगली प्रसंस्करण (जोड़ना, घटाना ...) असंभव है। – jezrael

+0

@ जेसराइल, ऐसा करने के अन्य तरीके हैं, उदाहरण के लिए, आपका समाधान। हालांकि, कॉलिंग में int प्रकारों के साथ मिश्रित NaNs के साथ जोड़ने/घटाना कोई समस्या नहीं है। आवश्यकतानुसार उन्हें स्वचालित रूप से फ्लोट ऑपरेशंस में डाला जाएगा। – clocker

+0

मैं इसका परीक्षण नहीं करता, टिप्पणी के लिए धन्यवाद। – jezrael

0

कैसे के बारे में:

df_test['Difference'] = (df_test['First_Date'] - df_test['Second Date']).dt.days 

इस पूर्णांक के रूप में अंतर वापस आ जाएगी।

संबंधित मुद्दे