2014-11-13 2 views
2

У меня есть кадр данных pandas, df_data, вы хотите использовать метод pandas index.asof(), чтобы найти ближайшую строку к указанному времени. Время, которое у меня есть, находится в секундах (тип = float64) (см. Ниже).python pandas TypeError: Невозможно сравнить тип «Timestamp» с типом «float»

Первоначально индекс был сделан, чтобы быть DateTimeIndex:

In [12]: df_data.index = pd.to_datetime(df_data.index, coerce=True) 
     df_data.index.dtype 
Out[12]: dtype('<M8[ns]') 

Затем я изменил индекс, чтобы быть в секундах от начального времени:

In [22]: ## Convert the index from DateTimeIndex to a float64 
     ## that is the number of seconds from the initial measurement 
     df_data.index = (df_data.index - df_data.index[0])/np.timedelta64(1,'s') 
In [23]: df_data.index.dtype 
Out[23]: dtype('float64') 

Но когда я пытаюсь использовать метод asof с поплавком, я получаю TypeError:

In [24]: df_data.index.asof(10.0) 
... 
TypeError: Cannot compare type 'Timestamp' with type 'float' 

Я пытался использовать DateTime, datetime.fro mtimestamp и т. д., но не смогли решить проблему.

+0

Хотя это не указано явно в документации, я думаю, что 'работает asof' только с DatetimeIndex, а не с другими типами индексов. – joris

+0

@joris: Я думаю, вы правы в том, что 'asof' ограничен DateTimeIndex. Я изменил свой код, чтобы использовать метод (и сохранить результаты), прежде чем менять индекс с DateTime на float. Я отредактировал этот вопрос выше. – dhltp

ответ

1

Спасибо @joris за проницательный комментарий.

РЕШЕНИЕ

Перед изменением индекса от DateTimeIndex к поплавку (т.е. секунд от первоначального измерения, как описано в вопросе), вам нужно определить время (в данном случае я использую простой пример с один раз time_float), в котором вы хотели бы найти ближайший индекс. Затем эти показатели даты и времени могут быть преобразованы, чтобы плавать индексы:

In [21]: time_float = 10.0 
     time_td = df_data.index[0]+ datetime.timedelta(0,time_float) 
     ## convert from the DateTimeIndex type to time from start in seconds as type float64 
     time_index = (df_data.index.asof(time_td) - df_data.index[0]).total_seconds() 
     time_index 
Out[21]: 9.86296 

Теперь, после общего преобразования индекса (приведенного выше) в секундах от начального времени, можно обратиться к индексу ближе всего к time_float, который является time_index:

In [24]: df_data.ix[time_index,0] 
Out[24]: 0.00075450129999999997 
Смежные вопросы