2016-03-22 3 views
1

Использование pandas 0.6.2. Я хочу изменить dataframe к datetime типа, вот dataframepandas warning with 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 

И я хочу изменить каждый из элементов в tt в datetime типа, и получить hour. Код

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

и Варинг

__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 

Почему возникает предупреждение и как я могу справиться с этим?

Если изменить один элемент каждый раз, когда он работает, код

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

ответ

1

Просто сделайте это на весь Series, как to_datetime может работать на подобный массив арга и назначить непосредственно в колонну:

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 

Если вы изменили цикл на это, то он будет работать:

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 

код стонет, потому что вы работаете на потенциально копию этой строки на ФР, а не тем, с помощью нового indexers избегает этой неоднозначности

EDIT

Похоже, вы используете древняя версия панд, должна работать:

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

@unutbu Я думаю, для одной колонки он работает, но я согласен, что это должно быть четко, я думаю, что раньше я попробовал 'iloc', а затем изменен на' loc' , будет обновляться – EdChum

+0

Я знаю 'df ['date'] = pd.to_datetime (df ['date'])' работает, но я хочу получить «час» каждого элемента. Сделать это на всей 'Серии' не может отделить' date' с 'time', я попробовал' dt.time', но я не могу получить 'hour' отдельно. –

+0

Вы можете сделать 'df ['date']. Dt.hour' это векторный метод – EdChum