1
votes

incrémenter une date de début d'heure jusqu'à ce qu'elle atteigne une date de fin

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?


2 commentaires

Vos start_date_object et end_date_object sont les mêmes.


correction d'une modification de code, merci d'avoir attrapé cela


3 Réponses :


2
votes

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)


4 commentaires

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.



0
votes

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) 


0 commentaires

1
votes

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')


0 commentaires