2016-06-15 52 views
7

Ho due colonne in un frame di dati di Pandas che sono date.Panda: sottraendo due colonne di data e il risultato è un numero intero

Sto cercando di sottrarre una colonna da un'altra e il risultato è la differenza in numero di giorni come numero intero.

Una sbirciatina ai dati:

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 

ho creato una nuova colonna con successo con la differenza:

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 

Tuttavia non sono in grado di ottenere una versione numerica del risultato:

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 

risposta

7

È possibile dividere la colonna di dtypetimedelta entro il np.timedelta64(1, 'D'), ma uscita non int, ma float è, perché NaN values:

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.

5

È possibile utilizzare il modulo datetime per aiutare qui. Inoltre, come nota a margine, una data semplice sottrazione dovrebbe funzionare come di seguito:

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 

Ora, tipo di modifica a datetime.timedelta, e quindi utilizzare il metodo .days sugli oggetti timedelta validi.

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 

Spero che questo aiuti.

+0

Sì, è una soluzione possibile, ma penso che non sia un approccio raccomandato, perché l'output della colonna 'Diffference' è' object' e l'elaborazione successiva (aggiunta, sottrazione ...) è impossibile. – jezrael

+0

@jesrael, ci sono altri modi per fare, ad esempio, la tua soluzione. Tuttavia, l'aggiunta/sottrazione non è un problema con i NaN mescolati con i tipi int in una colonna. Verranno automaticamente convertiti in operazioni flottanti secondo necessità. – clocker

+0

Non lo collaudo, grazie per il commento. – jezrael

0

ne dite:

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

Ciò restituirà la differenza come int.