2009-08-03 7 views
2

Je souhaite utiliser une boucle for pour imprimer chaque date entre 2 dates. Va réellement fusionner ceci avec une requête MySQL pour passer la date dans la requête elle-même et dans le nom de fichier de la sortie.Création d'intervalles de date en Python

Alors, comment puis-je changer cela:

sum = 0 
for i in range(1,11): 
print sum 
sum += i 

à cela?

InputDate = '2009-01-01' 
for i in range('2009-01-01','2009-07-01'): 
print InputDate 
InputDate += i 

Je me rends compte qu'il ya quelque chose dans RRULE qui fait cette fonction exacte:

a = date(2009, 1, 1) 
b = date(2009, 7, 1) 
for dt in rrule(DAILY, dtstart=a, until=b): 
print dt.strftime("%Y-%m-%d") 

Mais, je suis limité à la version de python plus.

Ceci est la version de script shell de ce que je suis en train de faire, si cela aide à clarifier:

while [InputDate <= EndDate] 
do 
    sql="SELECT Date,SUM(CostUsd) FROM DailyStats WHERE Date = '$InputDate' GROUP BY Date" 
    name=$(mysql -h -sN -u -p -e "$sql" > DateLoop-$InputDate.txt db) 
    echo "$name" 
    InputDate=$((InputDate + 1)) 
done 

Alors, comment puis-je faire cela en Python? Ajouter une question de suivi ici pour plus de lisibilité.

Malheureusement, je ne peux pas utiliser la bibliothèque MySQL standard car nous avons une configuration propriétaire avec de nombreuses instances fonctionnant en parallèle. La seule façon d'exécuter ce type de requête est de se connecter à une instance à la fois, sur la ligne de commande.

en jour < = b: print "extrait Courir pour:" jour

sql = "SELECT date, SUM (CostUsd) de Statistique ðLorsque d.Date =" + jour + "GROUP BY Date"

os.system ('mysql -u -p -h -sN -e "+ sql +"> DateLoop- "+ jour +" txt db)

jour + = one_day

Répondre

7

Cela fonctionnera:

import datetime 

a = datetime.date(2009, 1, 1) 
b = datetime.date(2009, 7, 1) 
one_day = datetime.timedelta(1) 

day = a 

while day <= b: 
    # do important stuff 
    day += one_day 
+0

Merci balpha qui a fonctionné parfaitement. 1 question de suivi. Est-ce le bon moyen de transmettre la date en tant que variable ci-dessous: a = datetime.date (2009, 1, 1) b = datetime.date (2009, 7, 1) one_day = datetime.timedelta (1) jour = un en jour <= b: print "extrait Courir pour:" jour sql = "date SELECT, SUM (CostUsd) de Statistique ðLorsque d.Date = GROUP $ par jour par date" os.system ('mysql -h -sN -u -p -e "$ sql"> DateLoop-jour.txt db ') day + = one_day Je me rends compte qu'il existe des modules/bibliothèques pour exécuter ceci de python à MySQL, mais je préférerais utiliser la ligne de commande dans ce cas. Merci encore! –

+0

C'est assez difficile à lire dans un commentaire. En plus de cela, comme vous le dites vous-même, vous devriez vraiment repenser la manière de la ligne de commande. L'utilisation de liaisons de bibliothèque est plus fiable, plus sûre et probablement aussi beaucoup plus facile que d'utiliser cette solution de ligne de commande. – balpha

+0

En fait, je viens de confirmer que la ligne de commande est ma seule option dans ce cas. –

2

Essayez ceci:

import datetime 
dt1 = datetime.date(2009, 1, 1) 
dt2 = datetime.date(2009, 7, 1) 
dt = dt1 
while dt <= dt2: 
    print dt.strftime("%Y-%m-%d") 
    dt += datetime.timedelta(days=1) 

Vous dites que vous êtes limité à une ancienne version de Python. Si vous ne possédez pas le module datetime (Python < 2.3), vous pouvez aussi le faire:

import time 
dt1 = time.mktime(time.strptime('2009-01-01', '%Y-%m-%d')) 
dt2 = time.mktime(time.strptime('2009-07-01', '%Y-%m-%d')) 
ONE_DAY = 86400 
dt = dt1 
while dt <= dt2: 
    print time.strftime('%Y-%m-%d', time.gmtime(dt)) 
    dt += ONE_DAY 
2
In [1]: from dateutil.relativedelta import * 

In [2]: from datetime import * 

In [3]: aday = datetime.today() 

In [4]: nextweek = aday+relativedelta(weeks=1) 

In [5]: while aday<nextweek: 
    ...:  print datetime.strftime(aday,format='%Y-%b-%d') 
    ...:  aday+=relativedelta(days=1) 
    ...:  
    ...:  
    #Output 
2009-Aug-03 
2009-Aug-04 
2009-Aug-05 
2009-Aug-06 
2009-Aug-07 
2009-Aug-08 
2009-Aug-09 

Alors que vous pouvez faire, la plupart des choses à propos datetime utilisant le stdlib, (OMI) dateutil vous permet de le faire plus vite et mieux.

+0

J'ai pris congé pour terminer, mais cette réponse n'est même pas reconnue, juste parce que quelques personnes y ont répondu quelques secondes auparavant; ça craint! –

+0

On dirait plutôt qu'ils ont une heure d'avance, plutôt que de simples secondes ... – ThomasH

Questions connexes