La création d'un éventail de dates en Python
Je veux créer une liste de dates, à partir d'aujourd'hui, et de revenir à un nombre arbitraire de jours, par exemple, dans mon exemple 100 jours. Est-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
Vous devez vous connecter pour publier un commentaire.
Un peu mieux...
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 grand pour le temps de la série en général, et a le soutien direct des plages de dates.Par exemple
mp.date_range()
:Il a aussi beaucoup d'options pour rendre la vie plus facile. Par exemple, si vous souhaitez uniquement les jours de la semaine, vous serait-il suffit de l'échanger dans
bdate_range
.Voir la plage de dates de la documentation
En outre, il soutient pleinement pytz et fuseaux horaires peut en douceur durée de printemps/automne de l'heure d'été se déplace.
MODIFIER par l'OP:
Si vous avez besoin d'réelle python datetimes, par opposition aux Pandas horodateurs:
Il utilise le paramètre "fin" pour correspondre à la question d'origine, mais si vous voulez décroissant des dates:
list(map(pd.Timestamp.to_pydatetime, datelist))
pour obtenir de type datetime de retour...Obtenir la gamme de dates entre le début et date de fin (Optimisé pour le temps & espace de complexité):
Vous pouvez écrire un générateur de fonction qui renvoie la date d'objets à partir d'aujourd'hui:
Ce générateur renvoie la date à compter d'aujourd'hui et de revenir un jour à la fois. Voici comment faire pour prendre les 3 premières dates:
L'avantage de cette approche sur une boucle ou d'une compréhension de liste, c'est que vous pouvez revenir autant de fois que vous le souhaitez.
Modifier
Une version plus compacte à l'aide d'un générateur d'expression au lieu d'une fonction:
Utilisation:
Vous pouvez également utiliser le jour ordinale pour faire plus simple:
Ou, comme suggéré dans les commentaires, vous pouvez créer une liste comme ceci:
ouais, réinventer la roue....
juste une recherche sur le forum, et vous obtiendrez quelque chose comme ceci:
dateutil.rrule
implémente iCalendar RFC - il est plus facile à utiliser avec des fonctions bien définies comportement au lieu de plusieurs implémentations de près les mêmes fonctionnalités qui sont très légèrement différentes.dateutil.rrule
permet de limiter correction d'un bug à un seul endroit.Dans le titre de cette question, je m'attendais à trouver quelque chose comme
range()
, qui allait me permettre de spécifier deux dates et de créer une liste avec toutes les dates entre les deux. De cette manière, on n'a pas besoin de calculer le nombre de jours entre ces deux dates, si l'on ne sait pas à l'avance.Donc, avec le risque d'être un peu hors-sujet, ce one-liner fait le travail:
Tous les crédits à cette réponse!
Ici est un peu une réponse différente, en profitant de S. Lott de la réponse qui donne une liste de dates entre les deux dates
start
etend
. Dans l'exemple ci-dessous, à partir du début de 2017 à aujourd'hui.Un peu de retard de la réponse, je sais, mais j'ai juste eu le même problème et a décidé que Python interne de gamme de la fonction est un peu défaut à cet égard, j'ai donc remplacé dans une util module de la mine.
output = []
et de permuter les lignes dans lewhile cmp(...)
boucle. Comparerrange(0,10,1)
et_range(0,10,1)
.date_range
.Si il y a deux dates et vous avez besoin de la gamme essayez
Ici est essentiel que j'ai créé, à partir de mon propre code, ce qui pourrait aider. (Je sais que la question est trop vieux, mais d'autres peuvent l'utiliser)
https://gist.github.com/2287345
(même chose que ci-dessous)
Basée sur les réponses que j'ai écrit pour moi-même:
De sortie:
La différence est que j'ai l' '
date
' objet, non pas ladatetime.datetime
' un.Voici un liner pour les scripts bash pour obtenir une liste des jours de la semaine, c'est python 3. Facilement modifié pour que ce soit, l'int à la fin est le nombre de jours dans le passé que vous voulez.
Ici est une variante de fournir un début (ou plutôt à la fin) date
Ici est une variante de l'arbitraire de début et dates de fin. non pas que ce n'est pas très efficace, mais qui est bon pour mettre dans une boucle for dans un script bash:
Matplotlib liées
Je sais que cela a été répondu, mais je vais le mettre en bas de ma réponse, pour des raisons historiques, et depuis je pense que c'est simple.
Assurer qu'il ne sera pas gagner quoi que ce soit comme le code-golf, mais je pense que c'est élégant.
arange
avec les étapes est très gentil, maislistOfDates
se compose de numpy datetime64 au lieu de python natif datetimes.np.arange(…).astype(dt.datetime)
de fairearange
retour natif python datetime au lieu de numpy datetime64.Mensuel de la plage de dates générateur avec
datetime
etdateutil
. Simple et facile à comprendre:end
devrait êtrebase - datetime.timedelta
. D'ailleurs... Pourquoi est-ce une solution meilleure que l'original?De réponses ci-dessus, j'ai créé cet exemple pour la date générateur
Un autre exemple qui compte avant ou en arrière, à partir de Sandeep de réponse.
donne
et
donne
Noter que la date de départ est inclus dans le retour, donc si vous voulez un total de quatre dates, l'utilisation
timedelta(days=3)