2012-12-06 4 views
13

Chciałbym odfiltrować dane weekendowe i przeglądać dane tylko w dni powszednie (mon (0) -fri (4)). Jestem nowy w pandach, jaki jest najlepszy sposób na osiągnięcie tego w pandach?w pandach, w jaki sposób mogę pogrupować na dzień powszedni() dla kolumny datetime?

import datetime 
from pandas import * 

data = read_csv("data.csv") 
data.my_dt 

Out[52]: 
0  2012-10-01 02:00:39 
1  2012-10-01 02:00:38 
2  2012-10-01 02:01:05 
3  2012-10-01 02:01:07 
4  2012-10-01 02:02:03 
5  2012-10-01 02:02:09 
6  2012-10-01 02:02:03 
7  2012-10-01 02:02:35 
8  2012-10-01 02:02:33 
9  2012-10-01 02:03:01 
10 2012-10-01 02:08:53 
11 2012-10-01 02:09:04 
12 2012-10-01 02:09:09 
13 2012-10-01 02:10:20 
14 2012-10-01 02:10:45 
... 

chciałbym zrobić coś takiego:

weekdays_only = data[data.my_dt.weekday() < 5] 

AttributeError: obiekt 'numpy.int64' nie ma atrybutu 'dzień tygodnia'

ale to nie działa, przystań nie jest w pełni zorientowany w sposobie uzyskiwania dostępu do obiektów datetime w kolumnie.

Ostatecznym celem jest przygotowanie do hierarchicznie WeekDay godzinny zakres, coś jak:

monday, 0-6, 7-12, 13-18, 19-23 
tuesday, 0-6, 7-12, 13-18, 19-23 
+1

nie jestem pewien co do twojego przypadku użycia, ale normalnie używałbyś 'my_dt' jako indeksu, przekazując' parse_dates = True' i 'index_col = ' jako argumenty słów kluczowych do 'read_csv' i' read_csv' zwróci 'pandasTimeSeries '. Wtedy możesz po prostu zrobić "weekdays = data [data.index.weekday <5]" – bmu

Odpowiedz

23

Twój wywołanie funkcji „powszedni” nie działa, jak to działa na indeks, który data.my_dt jest tablicą Int64 (to jest, gdy komunikat o błędzie pochodzi z)

można utworzyć nową kolumnę danych zawierających dni tygodnia, przy użyciu coś jak:

data['weekday'] = data['my_dt'].apply(lambda x: x.weekday()) 

następnie można filtrować za dni powszednie z:

weekdays_only = data[data['weekday'] < 5 ] 

Mam nadzieję, że to pomoże

+1

świetnie! to zrobi ... ok, zauważyłem również, że można użyć pliku data.my_dt.map() do zrobienia tego samego. Czy znasz różnicę między .map() i .apply()? – monkut

+2

W tym przypadku są one równoważne. Zastosuj można również robić agregację i inne rzeczy –

8

szybszym sposobem byłoby wykorzystanie DatetimeIndex.weekday, tak:

temp = pd.DatetimeIndex(data['my_dt']) 
data['weekday'] = temp.weekday 

znacznie szybszy, zwłaszcza dla dużych Liczba rzędów. Aby uzyskać więcej informacji, sprawdź odpowiedź this.

+1

Jeśli korzystasz z Pandy 0.15 możesz po prostu napisać 'data ['my_dt']. Dt.weekday', pod warunkiem, że' data ['my_dt'] 'jest datetime lub timedelta lub podobny format oparty na dacie (więcej informacji na stronie http://pandas.pydata.org/pandas-docs/version/0.15.0/basics.html#basics-dt-accessors). Jeśli tak nie jest, 'data ['my_dt'] = pd.to_datetime (data ['my_dt'])) przekonwertuje go na datetime (możesz również określić format i inne rzeczy w' pd.to_datetime() ', zobacz http : //pandas.pydata.org/pandas-docs/stable/generated/pandas.tseries.tools.to_datetime.html). – Kartik

Powiązane problemy