J'ai une plage de dates comme celle-ci:
2018-01-01 00:00:00 2018-01-01 01:00:00 2018-01-01 02:00:00 ... .. 2018-01-31 23:59:59
Je l'ai convertie en objets:
2018-01-01 00:00:00 2018-01-01 01:00:00 2018-01-01 01:00:00
J'essaye d'écrire une fonction qui prendra la date de début et l'incrémentera d'une heure jusqu'à ce qu'elle atteigne la date de fin comme ceci:
def daterange(start,end):
while start <= end :
start = start + timedelta(hours=1)
print
daterange(start_date_object,end_date_object)
Mais actuellement, ma sortie est la suivante:
start_date_object = datetime.strptime(start_date, '%Y-%m-%dT%H:%M:%S') end_date_object = datetime.strptime(end_date, '%Y-%m-%dT%H:%M:%S')
Je m'attendais à ce qu'il le fasse
start_date ='2018-01-01T00:00:00' end_date ='2018-01-31T23:59:59'
Est-ce que j'utilise le delta de temps de manière incorrecte?
3 Réponses :
Vous devez initialiser la variable end_date_object en utilisant end_date plutôt que start_date c'est-à-dire:
2018-01-01 01:00:00 2018-01-01 02:00:00 2018-01-01 03:00:00 2018-01-01 04:00:00 2018-01-01 05:00:00 2018-01-01 06:00:00 2018-01-01 07:00:00 2018-01-01 08:00:00 2018-01-01 09:00:00 2018-01-01 10:00:00 . . . 2018-01-31 20:00:00 2018-01-31 21:00:00 2018-01-31 22:00:00 2018-01-31 23:00:00 2018-01-31 23:59:59
De plus , pour obtenir le 2018-01-31 23:59:59 pour la dernière ligne, vous devez utiliser plutôt que dans votre while, puis soustrayez 1 seconde de start avant de l'imprimer une dernière fois en dehors de la boucle while:
Code fixe complet:
XXX
Sortie:
from datetime import datetime
from datetime import timedelta
def daterange(start, end):
while start < end:
print(start)
start += timedelta(hours=1)
print(start - timedelta(seconds=1)) # To get the XX:XX:59:59 for the last line
start_date ='2018-01-01T00:00:00'
end_date ='2018-01-31T23:59:59'
start_date_object = datetime.strptime(start_date, '%Y-%m-%dT%H:%M:%S')
end_date_object = datetime.strptime(end_date, '%Y-%m-%dT%H:%M:%S')
daterange(start_date_object, end_date_object)
Ah je n'ai pas compris que j'avais end_date = start_date. Ce que j'ai remarqué en cours d'exécution, c'est cette ligne 2018-01-31 22:00:00 2018-01-31 23: 00: 00 / 2018-02-01 00:00:00 / 2018-01-31 23 : 59: 59 notez le 02-01 . comment est-ce possible dans cette boucle?
ouais je viens de l'exécuter, ça arrive juste après le 01-31 23:00 puis passe au 02-01 00:00 et la dernière ligne est 01-31-23: 59: 59
Je vois ce qui se passe .. son virement de bord une heure après avoir passé le contrôle
Corrigé, j'imprimais après l'ajout du delta temporel ... Je pense avoir corrigé ce bug hier mais je ne l'ai pas ajouté au code de réponse car j'ai copié les résultats du terminal.
Essayez ceci:
2018-01-01 01:00:00 2018-01-01 02:00:00 2018-01-01 03:00:00 2018-01-01 04:00:00 2018-01-01 05:00:00 . . . 2018-01-31 21:00:00 2018-01-31 22:00:00 2018-01-31 23:00:00 2018-02-01 00:00:00
Le résultat:
import datetime
start_date ='2018-01-01T00:00:00'
end_date ='2018-01-31T23:59:59'
start = datetime.datetime.strptime(start_date, '%Y-%m-%dT%H:%M:%S')
end = datetime.datetime.strptime(end_date, '%Y-%m-%dT%H:%M:%S')
while start<end:
start += datetime.timedelta(hours=1)
print(start)
pandas a une excellente fonctionnalité appelée date_range:
import pandas as pd
start_date ='2018-01-01T00:00:00'
end_date ='2018-01-31T23:59:59'
pd.date_range(start_date, end_date, freq='1h')
DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 01:00:00',
'2018-01-01 02:00:00', '2018-01-01 03:00:00',
'2018-01-01 04:00:00', '2018-01-01 05:00:00',
'2018-01-01 06:00:00', '2018-01-01 07:00:00',
'2018-01-01 08:00:00', '2018-01-01 09:00:00',
...
'2018-01-31 14:00:00', '2018-01-31 15:00:00',
'2018-01-31 16:00:00', '2018-01-31 17:00:00',
'2018-01-31 18:00:00', '2018-01-31 19:00:00',
'2018-01-31 20:00:00', '2018-01-31 21:00:00',
'2018-01-31 22:00:00', '2018-01-31 23:00:00'],
dtype='datetime64[ns]', length=744, freq='H')
Vos
start_date_objectetend_date_objectsont les mêmes.correction d'une modification de code, merci d'avoir attrapé cela