Je veux créer une liste de dates, en commençant par aujourd'hui, et en remontant un nombre arbitraire de jours, disons, dans mon exemple, 100 jours. Y a-t-il une meilleure façon de le faire que cela?
import datetime
a = datetime.datetime.today()
numdays = 100
dateList = []
for x in range (0, numdays):
dateList.append(a - datetime.timedelta(days = x))
print dateList
range(0, numdays)
dans ce cas?datetimes = [start + timedelta(seconds=x*60+randint(-30, 30)) for x in range (0, range_end*5, 5)]
où la variablerange_end = 10
Pandas
est idéal pour les séries chronologiques en général et prend directement en charge les plages de dates.Par exemple
pd.date_range()
:Il dispose également de nombreuses options pour vous faciliter la vie. Par exemple, si vous ne voulez que des jours de semaine, vous pouvez simplement échanger
bdate_range
.Voir la documentation des plages de dates
De plus, il prend entièrement en charge les fuseaux horaires pytz et peut s'étendre en douceur sur les décalages DST printemps / automne.
EDIT par OP:
Si vous avez besoin d'horaires de temps Python réels, par opposition aux horodatages Pandas:
Cela utilise le paramètre "end" pour correspondre à la question d'origine, mais si vous voulez des dates décroissantes:
la source
list(map(pd.Timestamp.to_pydatetime, datelist))
récupérer le type datetime ...pandas.datetime
classe est obsolète et sera supprimée des pandas dans une future version. Importezdatetime
plutôt à partir du module.Obtenez une plage de dates entre la date de début et la date de fin spécifiées (optimisé pour la complexité temporelle et spatiale):
la source
(end-start+1)
ne fonctionne pas, vous ne pouvez pas ajouter un timedelta et un int. Vous pouvez utiliser(end-start).days + 1
cependant.Vous pouvez écrire une fonction de générateur qui renvoie des objets de date à partir d'aujourd'hui:
Ce générateur renvoie des dates commençant à partir d'aujourd'hui et remontant un jour à la fois. Voici comment prendre les 3 premières dates:
L'avantage de cette approche sur la compréhension d'une boucle ou d'une liste est que vous pouvez revenir en arrière autant de fois que vous le souhaitez.
Éditer
Une version plus compacte utilisant une expression de générateur au lieu d'une fonction:
Usage:
la source
ouais, réinventer la roue .... il suffit de rechercher sur le forum et vous obtiendrez quelque chose comme ceci:
la source
dateutil.rrule
implémente iCalendar RFC - il est plus facile d'utiliser des fonctions avec un comportement bien défini au lieu de plusieurs implémentations de presque les mêmes fonctionnalités qui sont si légèrement différentes.dateutil.rrule
permet de limiter la correction de bugs à un seul endroit.rrule
nom n'est pas arbitraire; c'est du rfc correspondantVous pouvez également utiliser l'ordinal de jour pour le simplifier:
Ou, comme suggéré dans les commentaires, vous pouvez créer une liste comme celle-ci:
la source
D'après le titre de cette question, je m'attendais à trouver quelque chose comme
range()
ça, qui me permettrait de spécifier deux dates et de créer une liste avec toutes les dates entre les deux. De cette façon, on n'a pas besoin de calculer le nombre de jours entre ces deux dates, si on ne le sait pas au préalable.Donc, avec le risque d'être légèrement hors sujet, ce one-liner fait le travail:
Tous les crédits à cette réponse !
la source
Voici une réponse légèrement différente à partir de la réponse de S.Lott qui donne une liste de dates entre deux dates
start
etend
. Dans l'exemple ci-dessous, de début 2017 à aujourd'hui.la source
Une réponse tardive, je sais, mais j'ai juste eu le même problème et j'ai décidé que la fonction de plage interne de Python manquait un peu à cet égard, je l'ai donc remplacée dans un de mes modules util.
la source
output = []
et permuter les lignes dans lawhile cmp(...)
boucle. Comparezrange(0,10,1)
et_range(0,10,1)
.date_range
.Sur la base des réponses, j'ai écrit moi-même ceci:
Production:
La différence est que j'obtiens l'
date
objet ' ', pas celui 'datetime.datetime
'.la source
S'il y a deux dates et que vous avez besoin de la plage, essayez
la source
Voici l'essentiel que j'ai créé, à partir de mon propre code, cela pourrait aider. (Je sais que la question est trop ancienne, mais d'autres peuvent l'utiliser)
https://gist.github.com/2287345
(même chose ci-dessous)
la source
Voici un liner pour les scripts bash pour obtenir une liste des jours de la semaine, c'est python 3. Facilement modifié pour tout, l'int à la fin est le nombre de jours dans le passé que vous voulez.
Voici une variante pour fournir une date de début (ou plutôt de fin)
Voici une variante pour les dates de début et de fin arbitraires. pas que ce ne soit pas terriblement efficace, mais c'est bon pour mettre une boucle for dans un script bash:
la source
Matplotlib lié
la source
Je sais que cela a été répondu, mais je vais mettre ma réponse à des fins historiques, et puisque je pense que c'est simple.
Bien sûr, il ne gagnera rien comme le golf de code, mais je pense qu'il est élégant.
la source
arange
avec les étapes est assez sympa, mais selistOfDates
compose de numpy datetime64 au lieu de datetimes natifs python.np.arange(…).astype(dt.datetime)
pourarange
renvoyer le datetime natif python au lieu de numpy datetime64.Un autre exemple qui compte en avant ou en arrière, à partir de la réponse de Sandeep.
donne
et
donne
Notez que la date de début est incluse dans la déclaration, donc si vous voulez quatre dates au total, utilisez
timedelta(days=3)
la source
la source
Un générateur de plages de dates mensuelles avec
datetime
etdateutil
. Simple et facile à comprendre:la source
la source
end
devraitbase - datetime.timedelta
. De plus ... Pourquoi cette solution est-elle meilleure que l'original?À partir des réponses ci-dessus, j'ai créé cet exemple pour le générateur de date
la source