2010-05-18 8 views
30

Je travaille sur un petit tracker de fitness pour m'enseigner Django. Je veux représenter graphiquement mon poids au fil du temps, j'ai donc décidé d'utiliser le Wrapper Python Google Charts. Les graphiques Google requièrent que vous convertissiez votre date en coordonnées x. Pour ce faire, je veux prendre le nombre de jours dans mon ensemble de données en soustrayant la première pesée de la dernière pesée, puis en utilisant cela pour comprendre les coordonnées x (par exemple, je pourrais 100 par le résultat et incrémenter le x coord par le nombre résultant pour chaque coordonnée y.)Comment soustraire deux dates dans Django/Python?

Quoi qu'il en soit, j'ai besoin de comprendre comment soustraire les objets datetime Django les uns des autres et jusqu'à présent, je suis rayé à la fois google et ici à la pile. Je connais PHP, mais je n'ai jamais eu de contrôle sur la programmation OO, alors excusez mon ignorance. Voici ce que mes modèles ressemblent:

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() 

Toutes les idées sur la façon de procéder dans la vue? Merci beaucoup!

Répondre

54

Vous pouvez simplement soustraire les dates directement, ce qui donnera un objet datetime.timedelta:

dt = weight_now.weight_date - weight_then.weight_date 

Un objet timedelta a des champs pendant des jours, secondes et microsecondes. De là, vous pouvez juste faire les mathématiques appropriées. Par exemple:

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

Parfait, merci beaucoup. Utilisé ceci presque mot pour mot. –

31

Les objets Django datetime sont juste normaux Python datetime objects. Lorsque vous soustrayez un datetime d'un autre, vous obtenez un objet timedelta.

Si vous cherchez à soustraire un délai à partir d'un datetime vous devez soustraire un timedelta objet de celui-ci. Par exemple:

>>> 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

C'est génial. Merci beaucoup ... J'ai tellement l'habitude de penser en cordes, je ne pensais pas que l'objet puisse être généré en soustrayant deux autres objets. –

3

Notez que la soustraction ne fonctionne pas dans le cas où les deux fois, à cette date différente conscience de décalage, par exemple, l'une avec et l'autre sans tzinfo (natif).

+0

ce n'est pas une réponse à la question. laisser un commentaire sur une autre réponse si vous avez quelque chose à ajouter à ce qui a été dit – FistOfFury

Questions connexes