42

I'm working on a little fitness tracker in order to teach myself Django. I want to graph my weight over time, so I've decided to use the Python Google Charts Wrapper. Google charts require that you convert your date into a x coordinate. To do this I want to take the number of days in my dataset by subtracting the first weigh-in from the last weigh-in and then using that to figure out the x coords (for example, I could 100 by the result and increment the x coord by the resulting number for each y coord.)

Anyway, I need to figure out how to subtract Django datetime objects from one another and so far, I am striking out on both google and here at the stack. I know PHP, but have never gotten a handle on OO programming, so please excuse my ignorance. Here is what my models look like:

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

Any ideas on how to proceed in the view? Thanks so much!

jnns
  • 5,148
  • 4
  • 47
  • 74
biased_estimator
  • 723
  • 3
  • 7
  • 13

3 Answers3

69

You can just subtract the dates directly, which will yield a datetime.timedelta object:

dt = weight_now.weight_date - weight_then.weight_date

A timedelta object has fields for days, seconds, and microseconds. From there, you can just do the appropriate math. For example:

hours = dt.seconds / 60 / 60    # Returns number of hours between dates
weeks = dt.days / 7             # number of weeks between dates
mipadi
  • 398,885
  • 90
  • 523
  • 479
37

Django datetime objects are just regular Python datetime objects. When you subtract one datetime from another you get a timedelta object.

If you are looking to subtract a length of time from a datetime you need to subtract a timedelta object from it. For example:

>>> 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
Dan Head
  • 2,672
  • 1
  • 17
  • 10
  • This is great. Thanks so much... I'm so used to thinking in strings, I didn't think can object could be generated by subtracting two other objects. – biased_estimator May 19 '10 at 12:01
5

Note that subtracting will not work in case the two date times have different offset-awareness, e.g., one with tzinfo and one without (native).

Itkovian
  • 87
  • 1
  • 3
  • 2
    this is not an answer to the question. leave a comment on another answer if you have something to add to what's been said – FistOfFury Dec 31 '17 at 17:35