2016-03-22 6 views
1

Mit pandas 0.6.2. Ich möchte einen Datenrahmen zu datetime Typ ändern, hier der Datenrahmen istPandas Warnung mit pd.to_datetime

>>> tt.head() 
0 2015-02-01 00:46:28 
1 2015-02-01 00:59:56 
2 2015-02-01 00:16:27 
3 2015-02-01 00:33:45 
4 2015-02-01 13:48:29 
Name: TS, dtype: object 

Und ich will jedes Einzelteil in tt in datetime Typen ändern, und die hour zu bekommen. Der Code ist

for i in tt.index: 
    tt[i]=pd.to_datetime(tt[i]) 

und waring ist

__main__:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame 

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 

Warum die Warnung auftritt und wie kann ich damit umgehen?

Wenn ich ein Element jedes Mal ändern, es funktioniert, ist der Code

>>> tt[1]=pd.to_datetime(tt[1]) 
>>> tt[1].hour 
0 

Antwort

1

Tun Sie es einfach auf dem gesamten Series als to_datetime auf Array-artige args arbeiten und weisen direkt auf die Säule:

In [72]: 
df['date'] = pd.to_datetime(df['date']) 
df.info() 

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 5 entries, 0 to 4 
Data columns (total 1 columns): 
date 5 non-null datetime64[ns] 
dtypes: datetime64[ns](1) 
memory usage: 80.0 bytes 

In [73]: 
df 

Out[73]: 
        date 
index      
0  2015-02-01 00:46:28 
1  2015-02-01 00:59:56 
2  2015-02-01 00:16:27 
3  2015-02-01 00:33:45 
4  2015-02-01 13:48:29 

Wenn Sie Ihre Schleife dies dann geändert würde es funktionieren:

In [80]: 
for i in df.index: 
    df.loc[i,'date']=pd.to_datetime(df.loc[i, 'date']) 
df 

Out[80]: 
         date 
index      
0  2015-02-01 00:46:28 
1  2015-02-01 00:59:56 
2  2015-02-01 00:16:27 
3  2015-02-01 00:33:45 
4  2015-02-01 13:48:29 

der Code stöhnt, weil Sie auf möglicherweise eine Kopie dieser Zeile auf dem df und nicht im Hinblick Betrieb, die neue indexers mit vermeidet diese Mehrdeutigkeit

EDIT

Es sieht aus wie Sie ein verwenden alte Version von Pandas, sollte die folgende Arbeit:

tt[1].apply(lambda x: x.hour) 
+0

@unutbu ich für einzelne Spalte denke, es funktioniert, aber ich stimme zu, dass dies explizit sein sollte, denke ich früher hatte ich versucht, 'iloc' und dann geändert' loc' , werde aktualisiert – EdChum

+0

Ich weiß 'df [' date '] = pd.to_datetime (df [' date ']) ' funktioniert, aber ich möchte die "Stunde" jedes Artikels erhalten. Kann es auf der gesamten "Serie" nicht das "Datum" mit der "Zeit" trennen, habe ich 'dt.time' versucht, aber ich kann die' Stunde' nicht getrennt bekommen. –

+0

Sie können 'df ['Datum']. Dt.hour' Dies ist eine vektorisierte Methode – EdChum