2010-05-18 9 views
30

Sto lavorando a un piccolo fitness tracker per insegnarmi Django. Voglio tracciare il mio peso nel tempo, quindi ho deciso di utilizzare Python Google Wrapper. I grafici di Google richiedono che tu converta la tua data in una coordinata x. Per fare questo voglio prendere il numero di giorni nel mio set di dati sottraendo la prima pesata dall'ultima pesata e poi usando quella per capire le x coords (per esempio, potrei 100 dal risultato e incrementare il x coord per il numero risultante per ogni yord.)Come sottrai due date in Django/Python?

In ogni caso, ho bisogno di capire come sottrarre gli oggetti datetime di Django l'uno dall'altro e finora, sto colpendo sia su google che qui in pila. Conosco PHP, ma non ho mai avuto un controllo sulla programmazione OO, quindi scusate la mia ignoranza. Ecco come sono i miei modelli:

class Goal(models.Model): 
    goal_weight = models.DecimalField("Goal Weight", 
     max_digits=4, 
     decimal_places=1) 
    target_date = models.DateTimeField("Target Date to Reach Goal") 
    set_date = models.DateTimeField("When did you set your goal?") 
    comments = models.TextField(blank=True) 

    def __unicode__(self): 
     return unicode(self.goal_weight) 

class Weight(models.Model): 
    """ Weight at a given date and time. """ 

    goal = models.ForeignKey(Goal) 
    weight = models.DecimalField("Current Weight", 
     max_digits=4, 
     decimal_places=1) 
    weigh_date = models.DateTimeField("Date of Weigh-In") 
    comments = models.TextField(blank=True) 

    def __unicode__(self): 
     return unicode(self.weight) 

    def recorded_today(self): 
     return self.date.date() == datetime.date.today() 

Qualche idea su come procedere nella visualizzazione? Grazie mille!

risposta

54

si può semplicemente sottrarre le date direttamente, che produrrà un oggetto datetime.timedelta:

dt = weight_now.weight_date - weight_then.weight_date 

Un oggetto timedelta ha campi per giorni, secondi e microsecondi. Da lì, puoi semplicemente fare la matematica appropriata. Ad esempio:

hours = dt.seconds/60/60 # Returns number of hours between dates 
weeks = dt.days/7    # number of weeks between dates 
+0

Perfetto, grazie mille. Usato quasi alla lettera. –

31

Gli oggetti Django datetime sono solo regolari Python datetime objects. Quando sottrai uno datetime da un altro ottieni un oggetto timedelta.

Se si desidera sottrarre un intervallo di tempo da un datetime, è necessario sottrarre un oggetto timedelta da esso. Per esempio:

>>> from datetime import datetime, timedelta 
>>> now = datetime.now() 
>>> print now 
2010-05-18 23:16:24.770533 
>>> this_time_yesterday = now - timedelta(hours=24) 
>>> print this_time_yesterday 
2010-05-17 23:16:24.770533 
>>> (now - this_time_yesterday).days 
1 
+0

Questo è fantastico. Grazie mille ... Sono così abituato a pensare nelle stringhe, non pensavo che l'oggetto potesse essere generato sottraendo altri due oggetti. –

3

noti che sottraendo non funzionerà in caso i due volte data hanno differenti offset consapevolezza, per esempio, uno con tzinfo e uno senza (nativo).

+0

questa non è una risposta alla domanda. lascia un commento su un'altra risposta se hai qualcosa da aggiungere a ciò che è stato detto – FistOfFury