2014-07-17 37 views
6

Ho un dataframe con una colonna di tipo datetime64. In questa colonna ci sono diverse righe con date come 1999-09-09 23:59:59 dove dovrebbero essere state effettivamente rappresentate come date mancanti NaT. Qualcuno ha deciso di utilizzare questa data specifica per rappresentare i dati mancanti. Ora voglio che queste date vengano sostituite come NaT (il tipo di data mancante per Pandas).Sostituisci data con NaT in Pandas dataframe

Anche se eseguire l'operazione su questa colonna con NAT, come

df['date'] - df['column with missing date'] 

Does Panda ignorare le date mancanti e mantenere NAT per le righe o intende gettare un errore qualche cosa come Null un'eccezione di puntatore in Java.

+0

fa 'df.loc [ df ['date'] == '1999-09-09 23:59:59', 'date'] = pd.NaT' lavoro? – EdChum

risposta

5
In [6]: 
import pandas as pd 
df = pd.DataFrame({'date':[pd.datetime(1999,9,9,23,59,59), pd.datetime(2014,1,1)]* 10}) 
df 
Out[6]: 
        date 
0 1999-09-09 23:59:59 
1 2014-01-01 00:00:00 
2 1999-09-09 23:59:59 
3 2014-01-01 00:00:00 
4 1999-09-09 23:59:59 
5 2014-01-01 00:00:00 
6 1999-09-09 23:59:59 
7 2014-01-01 00:00:00 
8 1999-09-09 23:59:59 
9 2014-01-01 00:00:00 
10 1999-09-09 23:59:59 
11 2014-01-01 00:00:00 
12 1999-09-09 23:59:59 
13 2014-01-01 00:00:00 
14 1999-09-09 23:59:59 
15 2014-01-01 00:00:00 
16 1999-09-09 23:59:59 
17 2014-01-01 00:00:00 
18 1999-09-09 23:59:59 
19 2014-01-01 00:00:00 
In [9]: 

import numpy as np 
df.loc[df['date'] == '1999-09-09 23:59:59 ', 'date'] = pd.NaT 
df 
Out[9]: 
     date 
0   NaT 
1 2014-01-01 
2   NaT 
3 2014-01-01 
4   NaT 
5 2014-01-01 
6   NaT 
7 2014-01-01 
8   NaT 
9 2014-01-01 
10  NaT 
11 2014-01-01 
12  NaT 
13 2014-01-01 
14  NaT 
15 2014-01-01 
16  NaT 
17 2014-01-01 
18  NaT 
19 2014-01-01 

Per rispondere alla tua seconda domanda la maggior parte delle funzioni gestiscono panda Nan in modo appropriato, si può sempre e solo rilasciarli:

In [10]: 

df.dropna() 
Out[10]: 
     date 
1 2014-01-01 
3 2014-01-01 
5 2014-01-01 
7 2014-01-01 
9 2014-01-01 
11 2014-01-01 
13 2014-01-01 
15 2014-01-01 
17 2014-01-01 
19 2014-01-01 

ed eseguire l'operazione solo su queste righe

+0

Grazie per la soluzione. Il fatto è che non volevo rilasciare queste righe NaT perché volevo sottrarre questa colonna della data da un'altra colonna della data. Fa il lavoro e dà i valori NaT nelle colonne risultanti ovunque ci fosse un NaT nella colonna originale. – user3527975

+1

@ user3527975 il punto qui è che 'dropna' non ha effetto sul dataframe originale, questo avverrà solo se si assegna al df originale come:' df = df.dropna() 'o' df.dropna (inplace = True) ' – EdChum