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]
En utilisant python, je veux ajouter une colonne qui est "heure de la semaine", j'ai réussi à le faire en utilisant excel mais je ne suis pas sûr de savoir comment procéder en Python.
Voici comment je l'ai calculé dans Excel:
Toute aide serait appréciée, merci.
3 Réponses :
Essayez ceci:
En supposant que la colonne date est de type datetime
dayofweek: 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 datetime avec
df ['date'] = pd.to_datetime (df ['date'])
Non ça me renvoie juste l'heure de la journée, je veux l'heure de la semaine, c'est-à-dire quelque part entre 0-168 (168 = 24 * 7) . Aussi, qu'entendez-vous par le lien Excel ne fonctionne pas?
Cette solution fonctionne en quelque sorte, pour ma première date / heure, elle donne l'heure correcte de la semaine, mais l'heure de la semaine devrait redescendre une fois qu'elle atteint 168, mais dans votre solution, l'heure de la semaine ne cesse d'augmenter
Mettre à jour pour utiliser la fonction dayofweek .
Votre code crée des heures par semaine avec une valeur minimale de 25 et une valeur maximale de 192 , mais je le souhaite sur un code 1-168 > échelle?
Mis à jour; cependant, si votre plage est 0-168 alors 0:30 doit avoir l'heure 0 et non 1. Sauf si vous voulez la plage 1-167 puisque l'heure la plus élevée sera 23.
Il doit être 1-168
Oui, cela fonctionne merci !. Assurez-vous simplement d'ajouter des crochets fermés après dt.hour + 1
Juste une suggestion, mais vous pourriez envisager d'utiliser 0-167. Pandas df ['Date']. Dt.hour ( Heure du jour ) commence à 0 , donc si vous avez l'intention de comparer, vous devrez toujours vous rappeler d'ajouter < code> 1 . La 0e heure sera inférieure à une heure et le moment de 24 heures sera toujours 23h59. Juste une suggestion car vous devrez compenser la différence partout où vous attribuez.
Si la colonne Date est un objet datetime, j'irais avec 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)
Votre solution présente le même problème que @ksooklall. Avec votre code, l'heure minimum d'une semaine est 25 mais elle doit être 1 et le maximum dans le vôtre est 192 mais le maximum doit être 168 .
@ user11015000 Vous avez un point. Passé à l'utilisation du jour de la semaine au lieu de l'isoweekday. Documentation
@ChrisLarson Ça devrait l'être. Après tout, 0 et 168 sont essentiellement le même point. Votre fin de semaine est aussi le début de la semaine
En supposant le format de date que vous avez dans votre exemple, ce qui suit générera l'heure de la semaine à partir d'un objet datetime généré avec votre horodatage:
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
Résultat:
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
Cela devrait vous donner les outils dont vous avez besoin pour appliquer dans votre contexte. Comme ça:
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
Notez que, si vous souhaitez vraiment commencer la journée avec l'heure 1 plutôt que zéro, vous devrez faire:
df['Day of Week'] = df['Date'].dt.dayofweek + 1
et
df['Hour of Day'] = df['Date'].dt.hour + 1
pour éviter toute confusion.
Tout comme ce qui suit pour décaler le premier jour à 1 :
df['Hour of Week'] = ((df['Date'].dt.dayofweek) * 24 + 24) - (24 - df['Date'].dt.hour) + 1
Rappelez-vous simplement que la valeur de Heure df ['Date']. dt.hour code > commence par 0 chaque fois que vous faites des comparaisons. Pour cette raison, je suggère d'utiliser 0 comme standard. Il en va de même pour Jour de la semaine .
Avec Heure de la semaine commençant à 0 , votre dataframe ressemble à ceci avec ce qui précède:
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']]
Avec le jour et les heures incrémentés de 1:
Hour of the week: 41
Vous obtenez:
XXX
Comment créez-vous l'entrée de temps? Python gérera beaucoup mieux si vous pouvez le convertir en une valeur datetime.
Je l'ai converti en une valeur de date / heure avec
df ['Date'] = pd.to_datetime (df ['Date']). C'est ce que tu veux dire?en regardant vos données, day_of_week est-il toujours 6?
Non, le jour de la semaine est le
6alors que le jour est le samediPouvez-vous montrer un exemple reproductible minimal qui couvre la génération de votre fichier de données?
Les données proviennent d'une autre source et la colonne
semaineest créée dans Excel avecjour de la semaineet la colonne heure estheureet heure de la semaine comme indiqué ci-dessus