J'ai le code suivant pour le faire, mais comment puis-je le faire mieux? À l'heure actuelle, je pense que c'est mieux que les boucles imbriquées, mais cela commence à devenir Perl-one-linerish lorsque vous avez un générateur dans une liste de compréhension.
day_count = (end_date - start_date).days + 1
for single_date in [d for d in (start_date + timedelta(n) for n in range(day_count)) if d <= end_date]:
print strftime("%Y-%m-%d", single_date.timetuple())
Remarques
- Je ne l'utilise pas réellement pour imprimer. C'est juste à des fins de démonstration.
- Les variables
start_date
etend_date
sont desdatetime.date
objets car je n'ai pas besoin des horodatages. (Ils vont être utilisés pour générer un rapport).
Exemple de sortie
Pour une date de début 2009-05-30
et une date de fin de 2009-06-09
:
2009-05-30
2009-05-31
2009-06-01
2009-06-02
2009-06-03
2009-06-04
2009-06-05
2009-06-06
2009-06-07
2009-06-08
2009-06-09
Réponses:
Pourquoi y a-t-il deux itérations imbriquées? Pour moi, il produit la même liste de données avec une seule itération:
Et aucune liste n'est stockée, un seul générateur est itéré. De plus, le "si" dans le générateur semble inutile.
Après tout, une séquence linéaire ne devrait nécessiter qu'un seul itérateur, pas deux.
Mise à jour après discussion avec John Machin:
La solution la plus élégante est peut-être d'utiliser une fonction de générateur pour masquer / abstraire complètement l'itération sur la plage de dates:
NB: Par souci de cohérence avec la
range()
fonction intégrée, cette itération s'arrête avant d' atteindre leend_date
. Donc, pour une itération inclusive, utilisez le lendemain, comme vous le feriez avecrange()
.la source
(start_date + datetime.timedelta(n) for n in range((end_date - start_date).days))
Cela pourrait être plus clair:
la source
Utilisez la
dateutil
bibliothèque:Cette bibliothèque python possède de nombreuses fonctionnalités plus avancées, certaines très utiles, comme
relative delta
s — et est implémentée sous la forme d'un fichier unique (module) qui est facilement inclus dans un projet.la source
until
que la date finale de ladaterange
méthode dans la réponse de Ber est exclusive deend_date
.Pandas est idéal pour les séries chronologiques en général et prend directement en charge les plages de dates.
Vous pouvez ensuite parcourir la daterange pour imprimer la date:
Il dispose également de nombreuses options pour vous faciliter la vie. Par exemple, si vous ne vouliez que les jours de la semaine, vous échangeriez simplement bdate_range. Voir http://pandas.pydata.org/pandas-docs/stable/timeseries.html#generating-ranges-of-timestamps
La puissance de Pandas est vraiment ses cadres de données, qui prennent en charge les opérations vectorisées (un peu comme numpy) qui rendent les opérations sur de grandes quantités de données très rapides et faciles.
EDIT: Vous pouvez également ignorer complètement la boucle for et l'imprimer directement, ce qui est plus facile et plus efficace:
la source
Cette fonction fait plus que vous avez besoin strictement, en soutenant pas de négatif, etc. Tant que vous tenez compte de votre logique de gamme, alors vous n'avez pas besoin séparé
day_count
et surtout le code devient plus facile à lire que vous appelez la fonction de plusieurs des endroits.la source
C'est la solution la plus lisible par l'homme à laquelle je puisse penser.
la source
Pourquoi ne pas essayer:
la source
La
arange
fonction de Numpy peut être appliquée aux dates:L'utilisation de
astype
est de convertir denumpy.datetime64
à un tableau d'datetime.datetime
objets.la source
dates = np.arange(d0, d1, dt).astype(datetime.datetime)
Afficher les n derniers jours d'aujourd'hui:
Production:
la source
print((datetime.date.today() + datetime.timedelta(i)).isoformat())
print((datetime.date.today() + datetime.timedelta(i)))
sans le .isoformat () donne exactement la même sortie. J'ai besoin de mon script pour imprimer YYMMDD. Quelqu'un sait comment faire cela?d = datetime.date.today() + datetime.timedelta(i); d.strftime("%Y%m%d")
la source
la source
Pour être complet, Pandas a également une
period_range
fonction pour les horodatages qui sont hors limites:la source
J'ai un problème similaire, mais je dois répéter chaque mois plutôt que quotidiennement.
C'est ma solution
Exemple 1
Production
Exemple # 2
Production
la source
Je
nepeuxpascroire que cette question existe depuis 9 ans sans que personne ne suggère une simple fonction récursive:Production:
Edit: * Maintenant, je peux le croire - voir Est - ce que Python optimise la récursivité de la queue? . Merci Tim .
la source
Vous pouvez générer une série de dates entre deux dates en utilisant la bibliothèque pandas simplement et en toute confiance
Vous pouvez modifier la fréquence de génération des dates en définissant freq sur D, M, Q, Y (quotidien, mensuel, trimestriel, annuel)
la source
la source
Cette fonction a quelques fonctionnalités supplémentaires:
vérification des erreurs au cas où la fin est plus ancienne que le début
la source
Voici le code d'une fonction de plage de dates générale, similaire à la réponse de Ber, mais plus flexible:
la source
Qu'en est-il de ce qui suit pour faire une plage incrémentée de jours:
Pour une version générique:
Notez que .total_seconds () n'est pris en charge qu'après python 2.7 Si vous êtes bloqué avec une version antérieure, vous pouvez écrire votre propre fonction:
la source
Approche légèrement différente des étapes réversibles en stockant les
range
arguments dans un tuple.la source
PRODUCTION:
la source