2 votes

Ajouter une colonne d'heure de la semaine en python

J'ai actuellement des données de séries chronologiques qui ressemblent à ceci :

>>> print(df)
                Date  Price of X  Price of Y
0     1/01/2011 0:30          19         172
1     1/01/2011 1:00          98         105
2     1/01/2011 1:30          40          -6
3     1/01/2011 2:00          68         120
4     1/01/2011 2:30          16         182
5     1/01/2011 3:00          23         187
6     1/01/2011 3:30          94         200
7     1/01/2011 4:00          21          97
8     1/01/2011 4:30          43         103
9     1/01/2011 5:00          68         136
10    1/01/2011 5:30          94         109
11    1/01/2011 6:00          94          26
12    1/01/2011 6:30          30          46
13    1/01/2011 7:00          30         116
14    1/01/2011 7:30          38         103
15    1/01/2011 8:00          66         185
16    1/01/2011 8:30          50         175
17    1/01/2011 9:00          71         126
18    1/01/2011 9:30          12         181
19   1/01/2011 10:00          35          77
20   1/01/2011 10:30          23         114
21   1/01/2011 11:00          39         107
22   1/01/2011 11:30          14          28
23   1/01/2011 12:00          38          39
24   1/01/2011 12:30          33         119
25   1/01/2011 13:00          55         117
26   1/01/2011 13:30           2          70
27   1/01/2011 14:00          13         194
28   1/01/2011 14:30          58         140
29   1/01/2011 15:00          54          73
..               ...         ...         ...
363  8/01/2011 14:00          25          84
364  8/01/2011 14:30          29          16
365  8/01/2011 15:00           1         129
366  8/01/2011 15:30           8          67
367  8/01/2011 16:00          65          65
368  8/01/2011 16:30          41         139
369  8/01/2011 17:00           0          27
370  8/01/2011 17:30          46         145
371  8/01/2011 18:00          27          -1
372  8/01/2011 18:30          97         109
373  8/01/2011 19:00          41         149
374  8/01/2011 19:30          27         197
375  8/01/2011 20:00          46          62
376  8/01/2011 20:30          53         117
377  8/01/2011 21:00          92          32
378  8/01/2011 21:30          41          88
379  8/01/2011 22:00          23          47
380  8/01/2011 22:30          96         126
381  8/01/2011 23:00          11         180
382  8/01/2011 23:30          44          84
383   9/01/2011 0:00          96          50
384   9/01/2011 0:30          46         109
385   9/01/2011 1:00          30          35
386   9/01/2011 1:30          89         197
387   9/01/2011 2:00          86          31
388   9/01/2011 2:30          55          67
389   9/01/2011 3:00          43         117
390   9/01/2011 3:30          79         133
391   9/01/2011 4:00          43          85
392   9/01/2011 4:30          78          50

[393 rows x 3 columns]

J'ai réussi à le faire en utilisant Excel, mais je ne suis pas sûr de savoir comment le faire en Python.

Voici comment je l'ai calculé dans Excel :

excel

Toute aide serait appréciée, merci.

2voto

ksooklall Points 1992

Essayez ça :

En supposant que le date La colonne est de type datetime

jour de la semaine : Le jour de la semaine avec lundi=0, dimanche=6

df['hour_of_the_week'] = df['date'].dt.dayofweek * 24 + (df['date'].dt.hour + 1)

Vous pouvez convertir date en date avec

df['date'] = pd.to_datetime(df['date'])

2voto

Chris Larson Points 26

En supposant le format de date que vous avez dans votre échantillon, ce qui suit va générer l'heure de la semaine à partir d'un objet datetime généré avec votre horodatage :

from datetime import datetime

timestamp = '2/19/2019 17:33'
timestamp_object = datetime.strptime(timestamp, '%m/%d/%Y %H:%M')

hour_of_week = (timestamp_object.timetuple().tm_wday * 24 + 24) - (24 - timestamp_object.timetuple().tm_hour)

print('Hour of the week: {}'.format(hour_of_week))

Sortie :

 Hour of the week: 41

Cela devrait vous donner les outils nécessaires à appliquer dans votre contexte. Comme ça :

df['Date'] = df['Date'].apply(pd.to_datetime)

df['Hour of Week'] = ((df['Date'].dt.dayofweek) * 24 + 24) - (24 - df['Date'].dt.hour)
df['Day of Week'] = df['Date'].dt.dayofweek
df['Hour of Day'] = df['Date'].dt.hour
df = df[['Date', 'Day of Week', 'Hour of Day', 'Hour of Week', 'Price of X', 'Price of Y']]

Notez que, si vous souhaitez définitivement commencer la journée à l'heure 1 plutôt qu'à l'heure zéro, vous devrez le faire :

df['Hour of Week'] = ((df['Date'].dt.dayofweek) * 24 + 24) - (24 - df['Date'].dt.hour) + 1

et

df['Hour of Day'] = df['Date'].dt.hour + 1

pour éviter toute confusion.

Tout comme le suivant pour compenser le premier jour à 1 :

df['Day of Week'] = df['Date'].dt.dayofweek + 1

N'oubliez pas que le Hour of Day valeur df['Date'].dt.hour commence par 0 lorsque vous effectuez des comparaisons. Pour cette raison, je suggère d'utiliser 0 comme votre norme. Il en va de même pour Day of Week .

Avec Hour of Week à partir de 0 votre cadre de données ressemble à quelque chose comme ceci avec ce qui précède :

                Date  Day of Week  Hour of Day  Hour of Week  Price of X  Price of Y
0 2011-01-01 00:30:00            5            0           120          19         172
1 2011-01-01 01:00:00            5            1           121          98         105
2 2011-01-01 01:30:00            5            1           121          40          -6
3 2011-01-01 02:00:00            5            2           122          68         120
4 2011-01-01 02:30:00            5            2           122          16         182
5 2011-01-01 03:00:00            5            3           123          23         187
6 2011-01-01 03:30:00            5            3           123          94         200
7 2019-02-18 00:01:00            0            0             0          23         187
8 2019-02-18 23:15:00            0           23            23          23         187
9 2019-02-24 23:59:00            6           23           167          23         187

Avec le jour et les heures incrémentés de 1 :

df['Hour of Week'] = ((df['Date'].dt.dayofweek) * 24 + 24) - (24 - df['Date'].dt.hour) + 1
df['Day of Week'] = df['Date'].dt.dayofweek + 1
df['Hour of Day'] = df['Date'].dt.hour + 1

Vous obtenez :

                 Date  Day of Week  Hour of Day  Hour of Week  Price of X  Price of Y
0 2011-01-01 00:30:00            6            1           121          19         172
1 2011-01-01 01:00:00            6            2           122          98         105
2 2011-01-01 01:30:00            6            2           122          40          -6
3 2011-01-01 02:00:00            6            3           123          68         120
4 2011-01-01 02:30:00            6            3           123          16         182
5 2011-01-01 03:00:00            6            4           124          23         187
6 2011-01-01 03:30:00            6            4           124          94         200
7 2019-02-18 00:01:00            1            1             1          23         187
8 2019-02-18 23:15:00            1           24            24          23         187
9 2019-02-24 23:59:00            7           24           168          23         187

1voto

kerwei Points 1782

Si la colonne Date est un objet datetime, j'utiliserais la bibliothèque datetime.

from datetime import timedelta

# Convert to timedelta
df['Hours'] = df.loc[:, 'Date'].apply(lambda x: timedelta(days=x.weekday(), hours=x.hour))
# Calculate the hours
df['Hours'] = df.loc[:, 'Hours'].apply(lambda x: x.total_seconds()/3600)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X