2015-04-29 4 views
0

Я пытаюсь добавить столбец в фрейм данных, который указывает разницу во времени каждого индекса строки и фиксированную метку времени. Кадр данных состоит из datetimeindex и некоторых строковых столбцов.Операция Timedelta дает неправильные результаты

Я использую

d["diff"] = d.index-t0 

для вычисления указанной разницы во времени. Из-за предварительной фильтрации наибольшее возможное значение разности должно составлять от 10 до 20 секунд. Тем не менее, я часто получаю diffs чуть ниже дня (на 1-10 с меньше), хотя фактическая разница составляет примерно 5 секунд.

Я читал, что предыдущая версия панд имела проблемы именно с этим, но, как говорили, она была долго исправлена.

Моим обходным путем было бы скопировать индекс, передать его в int64, отбросить t0 до int64, вычесть t0 из всех строк, а затем преобразовать столбец diff обратно в timedeltas, но это кажется крайне неэффективным и уродливым.

PS: Это происходит на OS X и Debian 8, используя pandas 0.16.0.

EDIT: В соответствии с просьбой, один образец:

2013-12-12 13:50:48 # t0 
timestamp 
2013-12-16 13:50:52 4 days 00:00:04 
Name: diff, dtype: timedelta64[ns] 

И я только что заметил, дата полностью выключен, я использую indexer_between_time(), чтобы получить индексы и смотрели только на время, а не дата. Это еще более запутанно.

indices = df.index.indexer_between_time(start_time=index,end_time=index+DateOffset(seconds=t_offset)) 
+0

Пример с образцовыми данными был бы полезен. – Zero

+0

Знаете ли вы, как негативно отпечатаны негативные timedeltas? 'pd.Timedelta (seconds = -0.5)' дает 'Timedelta ('- 1 days +23: 59: 59.500000')', потому что он всегда пытается сохранить значение секунд положительным при печати. Это то, что вы видите, или что-то еще? – Marius

+0

Добавлен образец и твист сюжета. – AdmiralSnackbar

ответ

1

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

end_time = index + DateOffset(seconds=t_offset) 
df.index[index:end_time] 

Это работает, как тоскует, как ваш DateTimeIndex монотонна/сортируют, если вы не можете сортировать первым.

+0

Мне пришлось изменить его на df [(df.index> index) & (df.index AdmiralSnackbar

Смежные вопросы