2014-01-21 4 views
2

Я пытаюсь удалить все «старые» значения из pandas TimeSeries, например. все значения, превышающие 1 день (относительно новейшего значения).Обрезка TimeSeries по timedelta

наивности, я пытался что-то вроде этого:

from datetime import timedelta 
def trim(series): 
    return series[series.index.max() - series.index < timedelta(days=1)] 

Выдает ошибку:

TypeError: ufunc 'subtract' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule 'safe' 

Очевидно, что проблема с этим выражением: series.index.max() - series.index

Я тогда нашел это работает:

def trim(series): 
    return series[series.index > series.index.max() - timedelta(days=1)] 

Может кто-нибудь объяснить, почему последний работает, а первый вызывает ошибку?

EDIT: Я использую панд версии 0.12.0

+0

пожалуйста показывают серии; для этого требуется 0.12 (и, возможно, 0,13) для поддержки временной дельта – Jeff

+0

@ shx2>. U2EF1

ответ

2

Вот пример в 0.13 (to_timedelta не в 0.12 доклада доступен, так вы должны сделать np.timedelta64(4,'D'))

In [12]: rng = pd.date_range('1/1/2011', periods=10, freq='D') 

In [13]: ts = pd.Series(randn(len(rng)), index=rng) 

In [14]: ts 
Out[14]: 
2011-01-01 -0.348362 
2011-01-02 1.782487 
2011-01-03 1.146537 
2011-01-04 -0.176308 
2011-01-05 -0.185240 
2011-01-06 1.767135 
2011-01-07 0.615911 
2011-01-08 2.459799 
2011-01-09 0.718081 
2011-01-10 -0.520741 
Freq: D, dtype: float64 

In [15]: x = ts.index.to_series().max()-ts.index.to_series() 

In [16]: x 
Out[16]: 
2011-01-01 9 days 
2011-01-02 8 days 
2011-01-03 7 days 
2011-01-04 6 days 
2011-01-05 5 days 
2011-01-06 4 days 
2011-01-07 3 days 
2011-01-08 2 days 
2011-01-09 1 days 
2011-01-10 0 days 
Freq: D, dtype: timedelta64[ns] 

In [17]: x[x>pd.to_timedelta('4 days')] 
Out[17]: 
2011-01-01 9 days 
2011-01-02 8 days 
2011-01-03 7 days 
2011-01-04 6 days 
2011-01-05 5 days 
Freq: D, dtype: timedelta64[ns] 
+0

Спасибо. поэтому я понимаю, что использование 'to_series()' является ключевым здесь. Не могли бы вы объяснить, почему это необходимо? – shx2

+0

индексы не являются рядами, поэтому у них нет всех тех же методов (в этом случае это будет работать с преобразованием в серию, но это хорошая практика) – Jeff

+0

Первоначально я не ожидал, что индексы будут сериями. Я ожидал, что они будут «np.array». И я проверил, что они действительно получены из 'np.ndarray'. Вот почему я был удивлен. – shx2

2

Вы можете использовать Truncating and Fancy Indexing следующим образом:

ts.truncate(before='Some Date') 

Пример:

rng = pd.date_range('1/1/2011', periods=72, freq='D') 
ts = pd.Series(randn(len(rng)), index=rng) 

ts.truncate(before=(ts.index.max() - dt.timedelta(days=1)).strftime('%m-%d-%Y')) 

Это должно усечение все перед старой датой. Вы также можете добавить аргумент after, чтобы уменьшить его, если хотите.

+0

+1 для указания 'truncate()' – shx2

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