Générer une liste de datetimes entre un intervalle
Donné deux datetimes (start_date
et end_date
), je voudrais générer une liste d'autres datetimes entre ces deux dates, la nouvelle datetimes étant séparés par une variable d'intervalle. par exemple, tous les 4 jours entre 2011-10-10 et 2011-12-12 ou toutes les 8 heures entre aujourd'hui et de demain, 19p.m.
Peut-être quelque chose à peu près équivalent à la Dateperiod classe PHP.
Quel serait le moyen le plus efficace pour accomplir cela en Python?
InformationsquelleAutor Joucks | 2012-05-21
Vous devez vous connecter pour publier un commentaire.
Utilisation
datetime.timedelta
:Fonctionne pour les dates et les objets datetime. Votre deuxième exemple:
range
. Il n'a de sens. Il y a une raison, c'est la faiblesse des tapé...timedelta
objet.Essayez ceci:
L'exemple de la question, "toutes les 8 heures entre aujourd'hui et de demain 19:00" devrait être écrit comme ceci:
Avis que les valeurs valides pour
period
sont ceux définis pour larelativedelta
relative de l'information, à savoir:'years', 'months', 'weeks', 'days', 'hours', 'minutes', 'seconds', 'microseconds'
.Ma solution renvoie une liste comme demandé dans la question. Si vous n'avez pas besoin de tous les éléments à la fois, vous pouvez utiliser les générateurs, comme dans @MartijnPieters réponse.
J'ai vraiment aimé les deux réponses par @Martijn Pieters et @Oscar López.
Permettez-moi de suggérer ma solution combinée entre ces deux réponses.
Les solutions suggérées ici fonctionnent bien pour des intervalles de jours, d'heures, etc. à l'aide de
timedelta
, ou tout ce quidateutil.relativedelta
prend en charge si vous voulez compter sur les bibliothèques de tiers. Mais je voulais partager ma solution pour le cas spécifique de chaque mois dans le format aaaamm, a demandé ici (mais marqué comme un double de cette question).De sortie:
Cette solution est assez spécifique à ce besoin particulier pour aaaamm mise en forme (même si ça revient souvent dans mon monde, au moins) et peut-être pas la plus efficace de répondre au grand nombre de
continue
s, mais a l'avantage d'être concis, facile à comprendre, et ne pas impliquer un certain nombre de bibliothèques ou de la date de conversion de code.Toutes les solutions apportées jusqu'ici sont spécifiques à des cas où les start < arrêter, mais vous pouvez facilement l'adapter pour gérer les cas où le stop < démarrage à l'aide de l'opérateur module comme le code suivant, adapté de @MartijnPieters réponse, illustre.