2015-03-17 18 views
7

Jeśli używam tej funkcji pd.DatetimeIndex(dfTrain['datetime']).weekday otrzymuję numer dnia, ale nie znajduję żadnej funkcji, która da nazwę de day ... Więc muszę przekonwertować 0 do poniedziałku, 1 do Tuestday i tak dalej.Num dzień na imię Dzień z Pandami

Oto przykład mojego dataframe:

  datetime season holiday workingday weather temp atemp humidity windspeed count 
    0 2011-01-01 00:00:00 1 0 0 1 9.84 14.395 81 0.0000 16 
    1 2011-01-01 01:00:00 1 0 0 1 9.02 13.635 80 0.0000 40 
    2 2011-01-01 02:00:00 1 0 0 1 9.02 13.635 80 0.0000 32 
    3 2011-01-01 03:00:00 1 0 0 1 9.84 14.395 75 0.0000 13 
    4 2011-01-01 04:00:00 1 0 0 1 9.84 14.395 75 0.0000 1 
    5 2011-01-01 05:00:00 1 0 0 2 9.84 12.880 75 6.0032 1 
    6 2011-01-01 06:00:00 1 0 0 1 9.02 13.635 80 0.0000 2 
    7 2011-01-01 07:00:00 1 0 0 1 8.20 12.880 86 0.0000 3 
    8 2011-01-01 08:00:00 1 0 0 1 9.84 14.395 75 0.0000 8 
    9 2011-01-01 09:00:00 1 0 0 1 13.12 17.425 76 0.0000 14 

Inną kwestią więcej, co jest różnica między pandas.DatetimeIndex.dayofweek i pandas.DatetimeIndex.weekday?

+1

więc dlaczego nie skorzystać z 7-krotki z nazwiskami dnia? – Skaperen

+1

Możesz otrzymać tablicę zlokalizowanych nazw dnia z [calendar.day_name] (https://docs.python.org/3/library/calendar.html#calendar.day_name) –

Odpowiedz

7

Jedną z metod, tak długo, jak datetime jest już kolumna datetime jest zastosowanie datetime.strftime aby uzyskać ciąg dla dnia tygodnia:

In [105]: 

df['weekday'] = df[['datetime']].apply(lambda x: dt.datetime.strftime(x['datetime'], '%A'), axis=1) 
df 
Out[105]: 
      datetime season holiday workingday weather temp atemp \ 
0 2011-01-01 00:00:00  1  0   0  1 9.84 14.395 
1 2011-01-01 01:00:00  1  0   0  1 9.02 13.635 
2 2011-01-01 02:00:00  1  0   0  1 9.02 13.635 
3 2011-01-01 03:00:00  1  0   0  1 9.84 14.395 
4 2011-01-01 04:00:00  1  0   0  1 9.84 14.395 
5 2011-01-01 05:00:00  1  0   0  2 9.84 12.880 
6 2011-01-01 06:00:00  1  0   0  1 9.02 13.635 
7 2011-01-01 07:00:00  1  0   0  1 8.20 12.880 
8 2011-01-01 08:00:00  1  0   0  1 9.84 14.395 
9 2011-01-01 09:00:00  1  0   0  1 13.12 17.425 

    humidity windspeed count weekday 
0  81  0.0000  16 Saturday 
1  80  0.0000  40 Saturday 
2  80  0.0000  32 Saturday 
3  75  0.0000  13 Saturday 
4  75  0.0000  1 Saturday 
5  75  6.0032  1 Saturday 
6  80  0.0000  2 Saturday 
7  86  0.0000  3 Saturday 
8  75  0.0000  8 Saturday 
9  76  0.0000  14 Saturday 

chodzi o inne pytanie, nie ma różnicy między dayofweek i weekday.

Będzie szybciej zdefiniować mapę tygodnia do równowartości String i nazywają mapy na dzień powszedni:

dayOfWeek={0:'Monday', 1:'Tuesday', 2:'Wednesday', 3:'Thursday', 4:'Friday', 5:'Saturday', 6:'Sunday'} 
df['weekday'] = df['datetime'].dt.dayofweek.map(dayOfWeek) 

Dla wersji przed 0.15.0 następujące powinny działać:

import datetime as dt 
df['weekday'] = df['datetime'].apply(lambda x: dt.datetime.strftime(x, '%A')) 

Wersja 0.18.1 i nowsza

Istnieje teraz nowa wygodna metoda dt.weekday_name do powyższych

+0

Co to jest 'dt'? Otrzymuję ten błąd = Obiekt AttributeError: 'Series' nie ma atrybutu 'dt'' – Yari

+0

Jakiej wersji pandy używasz? 'dt' jest dodatkiem do atrybutu datetime, który został dodany w' 0.15.0', ale twoja seria musi być typu ditpe, w razie potrzeby możesz konwertować: 'df ['datetime'] = pd.to_datetime (df [' datetime ']) ' – EdChum

+0

' 0.14.1' zawarte w Anacondzie. W każdym razie 'df ['datetime']' format to 'datetime64 [ns]' – Yari

7

W wersji 0.18.1 można użyć nowej metody dt.weekday_name:

df['weekday'] = df['datetime'].dt.weekday_name 
print df 
      datetime season holiday workingday weather temp atemp \ 
0 2011-01-01 00:00:00  1  0   0  1 9.84 14.395 
1 2011-01-01 01:00:00  1  0   0  1 9.02 13.635 
2 2011-01-01 02:00:00  1  0   0  1 9.02 13.635 
3 2011-01-01 03:00:00  1  0   0  1 9.84 14.395 
4 2011-01-01 04:00:00  1  0   0  1 9.84 14.395 
5 2011-01-01 05:00:00  1  0   0  2 9.84 12.880 
6 2011-01-01 06:00:00  1  0   0  1 9.02 13.635 
7 2011-01-01 07:00:00  1  0   0  1 8.20 12.880 
8 2011-01-01 08:00:00  1  0   0  1 9.84 14.395 
9 2011-01-01 09:00:00  1  0   0  1 13.12 17.425 

    humidity windspeed count weekday 
0  81  0.0000  16 Saturday 
1  80  0.0000  40 Saturday 
2  80  0.0000  32 Saturday 
3  75  0.0000  13 Saturday 
4  75  0.0000  1 Saturday 
5  75  6.0032  1 Saturday 
6  80  0.0000  2 Saturday 
7  86  0.0000  3 Saturday 
8  75  0.0000  8 Saturday 
9  76  0.0000  14 Saturday