2013-11-16 3 views
2

У меня есть pandas 30мин интервалов времени. Небольшой образец выглядит следующим образом:pandas timeseries идентификационные значения на основе индекса даты

2009-12-02 20:00:00 0.6 
2009-12-02 20:30:00 0.7 
2009-12-03 01:00:00 0.7 
2009-12-03 02:30:00 0.7 
2009-12-03 11:30:00 0.7 
2009-12-03 12:00:00 1.4 
2009-12-03 12:30:00 1.3 

Я должен indentify запуск, готовый дату (и сохранить его), если интервал между 2 продолжает метка времени более чем за 2 часа. , например:

event 1 : 2009-12-02 20:00:00 - 2009-12-02 20:30:00 
event 2 : 2009-12-03 01:00:00 - 2009-12-03 02:30:00 
event 3 : 2009-12-03 11:30:00 - 2009-12-03 12:30:00 

, но я немного застрял здесь !!! Обычно, если это был DataFrame я хотел бы использовать что-то вроде: for index, row df.iterrows(): #if timedelta > 2 hours etc

Любое предложение, как я мог бы начать? Ти

ответ

3
  1. Вычислить разницу во времени между двумя рядами.
  2. Получите серию bool, сравнив разницу с 2 часами.
  3. cumsum() серия bool, чтобы получить серию, которая может разбивать датфрейм.
  4. вызовите groupby и примените, чтобы получить начало и конец datetime для каждой группы.

Вот код:

import pandas as pd 
import io 
import numpy as np 

data = r"""date,value 
2009-12-02 20:00:00,0.6 
2009-12-02 20:30:00,0.7 
2009-12-03 01:00:00,0.7 
2009-12-03 02:30:00,0.7 
2009-12-03 11:30:00,0.7 
2009-12-03 12:00:00,1.4 
2009-12-03 12:30:00,1.3""" 

df = pd.read_csv(io.StringIO(data), parse_dates=[0]) 
diff = df.date - df.date.shift(1) 

sections = (diff > np.timedelta64(2, "h")).astype(int).cumsum() 

def f(s): 
    return s.iloc[[0, -1]].reset_index(drop=True) 

print df.date.groupby(sections).apply(f).unstack() 

выход:

    0     1 
0 2009-12-02 20:00:00 2009-12-02 20:30:00 
1 2009-12-03 01:00:00 2009-12-03 02:30:00 
2 2009-12-03 11:30:00 2009-12-03 12:30:00 
+0

Hyry, абсолютно pandaphonic путь :). Ty –

+0

было бы полезно получить немного больше объяснений относительно того, что здесь происходит. У меня есть аналогичная проблема, и я хотел бы иметь возможность построить решение, подобное этому, но этот код настолько «пандафонический», чтобы выглядеть больше как R, чем python. :п – szeitlin

0

t.txt имеет данные журнала

from datetime import datetime 

d1 = d2 = d3 = None 
for line in open('t.txt'): 
    d3 = datetime.strptime(line[:19], '%Y-%m-%d %H:%M:%S') 
    if d1 is None: 
     d1 = d2 = d3 
    elif (d3 - d2).seconds >= 2 * 3600: 
     print d1, d2 
     d1 = d2 = d3 
    else: 
     d2 = d3 
print d1, d2 
Смежные вопросы