2013-12-11 3 views
1

У меня есть временная ряд панды, который выглядит следующим образом:Reindex серия Панды найти ближайшие даты

In [1]: ser1 
Out[1]: 
Date 
2005-12-31 11382000 
Name: Amount, dtype: float64 

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

In [2]: ser2 
Out[2]: 
Date 
2005-12-20 14.13 
2005-12-21 14.22 
2005-12-22 14.30 
2005-12-23 14.35 
2005-12-27 14.32 
2005-12-28 14.32 
2005-12-29 14.23 
2005-12-30 14.19 
2006-01-03 14.48 
2006-01-04 14.54 
2006-01-05 14.68 
Name: Amount, dtype: float64 

Но когда я использую

ser3 = ser1.reindex(ser2.index) 

Я получаю

In [4]: ser3 
Out[4]: 
Date 
2005-12-20 NaN 
2005-12-21 NaN 
2005-12-22 NaN 
2005-12-23 NaN 
2005-12-27 NaN 
2005-12-28 NaN 
2005-12-29 NaN 
2005-12-30 NaN 
2006-01-03 NaN 
2006-01-04 NaN 
2006-01-05 NaN 
Name: Amount, dtype: float64 

Обратите внимание, что элемент из ser1, имеющий дату '2005-12-31', не отображается в ser3, так как индекс ser2 не включал 2005-12-31. Я хотел бы поместить значения ser1 в следующую доступную дату в индексе ser2. Как я могу это сделать?

+0

Вы хотите получить NaNs или значения из s2? –

+0

NaN's хороши для моих целей здесь. Более того, я хочу быть уверенным, что значения ser1 находятся в ser3 со следующей доступной даты. – TimHussonSLCG

ответ

3

Следующее позволит вам заполнить до ближайшей прямой даты, если ее nan (в противном случае это значение примет при этом индексе). (если вы хотите получить ближайшую дату назад, вы можете использовать метод bfill). IIRC это по-прежнему открытый вопрос в пандах, поскольку он немного нетривиальный (и теоретически должен быть метод заполнения, например «ближайший»), но для этого нужен PR!

In [25]: ser1 = Series(100000,index=[Timestamp('20051231')]) 

In [26]: ser1 
Out[26]: 
2005-12-31 100000 
dtype: int64 

In [27]: ser2 
Out[27]: 
0 
2005-12-20 14.13 
2005-12-21 14.22 
2005-12-22 14.30 
2005-12-23 14.35 
2005-12-27 14.32 
2005-12-28 14.32 
2005-12-29 14.23 
2005-12-30 14.19 
2006-01-03 14.48 
2006-01-04 14.54 
2006-01-05 14.68 
Name: 1, dtype: float64 

In [28]: ser1.reindex(ser2.index,method='ffill',limit=1) 
Out[28]: 
0 
2005-12-20  NaN 
2005-12-21  NaN 
2005-12-22  NaN 
2005-12-23  NaN 
2005-12-27  NaN 
2005-12-28  NaN 
2005-12-29  NaN 
2005-12-30  NaN 
2006-01-03 100000 
2006-01-04  NaN 
2006-01-05  NaN 
dtype: float64 
+0

Отлично! Большое спасибо. Я согласен с тем, что было бы неплохо иметь встроенный метод «ближайшего» (не кажется, что Pythonic требует такой умности), но это прекрасно решает мою проблему. – TimHussonSLCG

+0

Рут рох, говорил слишком рано. Если я использую этот метод и значение ser1 date в индексе, то значение ser1 будет дублироваться на следующую дату. Таким образом, этот метод не работает для серии, которая имеет как согласованные, так и несоответствующие даты. Есть ли работа для этой ситуации? – TimHussonSLCG

+0

Это был мой комментарий в ответе. вы могли бы сбросить эти согласованные после переиндекса с заполнением. – Jeff

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