2015-07-30 9 views
5

Witam, chłopaki, przypuśćmy, że mam dane dotyczące timeseries. Jak filtrować dane, które występują tylko w ciągu 1 dnia?Jak filtrować przesunięcie +/- 1 dzień w Pandach?

Załóżmy, że dane są

date   name 
2015-04-03 A 
2015-04-04 A 
2015-04-05 A 
2015-04-03 B 

Co chcę zrobić coś jak

df[df.shift(1).contains(df.name) or df.shift(-1).contains(df.name)] 

że da mi

date   name 
2015-04-03 A 
2015-04-04 A 
2015-04-05 A 

Jak to zrobić w pand?

+2

Szukasz dokładnych dopasowań czy „nazwy” naprawdę znaczy „zawierać” obecny rząd „nazwa” wartość – EdChum

+0

ja nie Rozumiem pytanie, ale wydaje się, że chcesz użyć 'groupby ('name')' tutaj, a następnie cokolwiek innego próbujesz zrobić. Może to? 'df.groupby ('name') ['date']. apply (lambda x: x == x.shift() + datetime.timedelta (1))' – JohnE

+1

To jest bardzo mylące pytanie, dlaczego ma 5 upvotes?!? Opis, kod i wyniki różnią się od siebie. Powinno to być rzeczywiście wyjaśnione przez PO, jeśli istnieje tak duże zainteresowanie pytaniem i odpowiedziami. – JohnE

Odpowiedz

0

Chcesz zawęzić warunki w nawiasach i użyć bitowego | zamiast or:

In [83]: 
df[(df['name'].shift(1) == df['name']) | (df['name'].shift(-1) == df['name']) ] 

Out[83]: 
     date name 
0 2015-04-03 A 
1 2015-04-04 A 
2 2015-04-05 A 
1

użyłbym value_counts dla terminu:

vc = df.date.value_counts() 

Potem będzie, jeśli zbiór danych jest mała, to użyłby .isin:

df[df.date.isin(vc[vc == 1].index.tolist())] 

     date name 
1 2015-04-04 A 
2 2015-04-05 A 

Jeśli zestaw danych jest większy, chciałbym użyć Operacja scalania:

df_singles = df.merge(left_on='date',right=pd.DataFrame(vc[vc == 1]), right_index=True) 
del df_singles[0] 

     date name 
1 2015-04-04 A 
2 2015-04-05 A 
0

Convert datę kolumnę do obiektu datetime. Następnie możesz obliczyć różnicę między dniami. Po tym, można filtrować za liczbę dni różnicy chcesz zachować

data['date'] = pd.to_datetime(data['date']) 
data['Diff'] = data['date'].diff() 
print data 

     date name Diff 
0 2015-04-03 A  NaT 
1 2015-04-04 A 1 days 
2 2015-04-05 A 1 days 
3 2015-04-03 B -2 days 

data_filtered = data[data['Diff'] == '1 days'] 
del data_filtered['Diff'] 
print data_filtered 

     date name 
1 2015-04-04 A 
2 2015-04-05 A