simpler increment of time values?

Discussion in 'Python' started by Vlastimil Brom, Jul 5, 2012.

  1. Hi all,
    I'd like to ask about the possibilities to do some basic manipulation
    on timestamps - such as incrementing a given time (hour.minute -
    string) by some minutes.
    Very basic notion of "time" is assumed, i.e. dateless,
    timezone-unaware, DST-less etc.
    I first thought, it would be possible to just add a timedelta to a
    time object, but, it doesn't seem to be the case.

    The code I came up with (using time and datetime modules) seems rather
    convoluted and I would like to ask about some possible more
    straightforward alternatives I missed.
    The equivalent function (lacking validation) without the (date)time
    libraries seems simple enough (for this limited and individual task).
    Although it is probably mostly throw-away code, which seems to do what
    I need, I'd be interested in better/more elegant... solutions.

    # # #
    import time
    import datetime
    import re

    print re.sub(r"^0","", (datetime.datetime(*list(time.strptime("8.45",
    "%H.%M"))[:6]) + datetime.timedelta(minutes=30)).strftime("%H.%M"))
    # 9.15

    # # # # # # # # #

    def add_minutes(hour_min_str, separator=".", minutes_to_add=0):
    h, m = [int(s) for s in hour_min_str.split(separator)]
    sum_minutes = h * 60 + m + minutes_to_add
    h, m = divmod(sum_minutes, 60)
    h = h % 24
    return "%s%s%s" % (h, separator, m)

    print add_minutes(hour_min_str="8.45", separator='.', minutes_to_add=30)
    # 9.15

    # # # # # # # # #

    Is it true, that timedelta cannot be used with dateless time values?
    (Is there some other possibility than the current one, where strptime
    actually infers 1. 1. 1900?)
    Is there some simpler way to adapt the incompatible output of strptime
    as the input of datetime?
    Is it possible to get one-digit hours formatted without the leading zero?

    Thanks in advance for any suggestions or remarks;
    regards,
    Vlastimil Brom
     
    Vlastimil Brom, Jul 5, 2012
    #1
    1. Advertising

  2. Vlastimil Brom

    Guest

    On Wednesday, July 4, 2012 6:29:10 PM UTC-6, Vlastimil Brom wrote:
    > Hi all,
    > I'd like to ask about the possibilities to do some basic manipulation
    > on timestamps - such as incrementing a given time (hour.minute -
    > string) by some minutes.
    > Very basic notion of "time" is assumed, i.e. dateless,
    > timezone-unaware, DST-less etc.
    > I first thought, it would be possible to just add a timedelta to a
    > time object, but, it doesn't seem to be the case.
    >
    > The code I came up with (using time and datetime modules) seems rather
    > convoluted and I would like to ask about some possible more
    > straightforward alternatives I missed.
    > The equivalent function (lacking validation) without the (date)time
    > libraries seems simple enough (for this limited and individual task).
    > Although it is probably mostly throw-away code, which seems to do what
    > I need, I'd be interested in better/more elegant... solutions.
    >
    > # # #
    > import time
    > import datetime
    > import re
    >
    > print re.sub(r"^0","", (datetime.datetime(*list(time.strptime("8.45",
    > "%H.%M"))[:6]) + datetime.timedelta(minutes=30)).strftime("%H.%M"))
    > # 9.15
    >
    > # # # # # # # # #
    >
    > def add_minutes(hour_min_str, separator=".", minutes_to_add=0):
    > h, m = [int(s) for s in hour_min_str.split(separator)]
    > sum_minutes = h * 60 + m + minutes_to_add
    > h, m = divmod(sum_minutes, 60)
    > h = h % 24
    > return "%s%s%s" % (h, separator, m)
    >
    > print add_minutes(hour_min_str="8.45", separator='.', minutes_to_add=30)
    > # 9.15
    >
    > # # # # # # # # #
    >
    > Is it true, that timedelta cannot be used with dateless time values?
    > (Is there some other possibility than the current one, where strptime
    > actually infers 1. 1. 1900?)
    > Is there some simpler way to adapt the incompatible output of strptime
    > as the input of datetime?
    > Is it possible to get one-digit hours formatted without the leading zero?
    >
    > Thanks in advance for any suggestions or remarks;
    > regards,
    > Vlastimil Brom


    If it's any consolation, I had to add a small constant time
    delta to all the times in a video subtitles file and my code
    ended up looking very much like yours. What should have take
    five minutes to write took several hours,

    I remain surprised and disappointed that doing something so
    simple (read time text into time object, add timedelta, print
    result) was so awkward in Python.
     
    , Jul 5, 2012
    #2
    1. Advertising

  3. Vlastimil Brom

    Guest

    On Wednesday, July 4, 2012 6:29:10 PM UTC-6, Vlastimil Brom wrote:
    > Hi all,
    > I'd like to ask about the possibilities to do some basic manipulation
    > on timestamps - such as incrementing a given time (hour.minute -
    > string) by some minutes.
    > Very basic notion of "time" is assumed, i.e. dateless,
    > timezone-unaware, DST-less etc.
    > I first thought, it would be possible to just add a timedelta to a
    > time object, but, it doesn't seem to be the case.
    >
    > The code I came up with (using time and datetime modules) seems rather
    > convoluted and I would like to ask about some possible more
    > straightforward alternatives I missed.
    > The equivalent function (lacking validation) without the (date)time
    > libraries seems simple enough (for this limited and individual task).
    > Although it is probably mostly throw-away code, which seems to do what
    > I need, I'd be interested in better/more elegant... solutions.
    >
    > # # #
    > import time
    > import datetime
    > import re
    >
    > print re.sub(r"^0","", (datetime.datetime(*list(time.strptime("8.45",
    > "%H.%M"))[:6]) + datetime.timedelta(minutes=30)).strftime("%H.%M"))
    > # 9.15
    >
    > # # # # # # # # #
    >
    > def add_minutes(hour_min_str, separator=".", minutes_to_add=0):
    > h, m = [int(s) for s in hour_min_str.split(separator)]
    > sum_minutes = h * 60 + m + minutes_to_add
    > h, m = divmod(sum_minutes, 60)
    > h = h % 24
    > return "%s%s%s" % (h, separator, m)
    >
    > print add_minutes(hour_min_str="8.45", separator='.', minutes_to_add=30)
    > # 9.15
    >
    > # # # # # # # # #
    >
    > Is it true, that timedelta cannot be used with dateless time values?
    > (Is there some other possibility than the current one, where strptime
    > actually infers 1. 1. 1900?)
    > Is there some simpler way to adapt the incompatible output of strptime
    > as the input of datetime?
    > Is it possible to get one-digit hours formatted without the leading zero?
    >
    > Thanks in advance for any suggestions or remarks;
    > regards,
    > Vlastimil Brom


    If it's any consolation, I had to add a small constant time
    delta to all the times in a video subtitles file and my code
    ended up looking very much like yours. What should have take
    five minutes to write took several hours,

    I remain surprised and disappointed that doing something so
    simple (read time text into time object, add timedelta, print
    result) was so awkward in Python.
     
    , Jul 5, 2012
    #3
  4. Vlastimil Brom

    John Nagle Guest

    On 7/4/2012 5:29 PM, Vlastimil Brom wrote:
    > Hi all,
    > I'd like to ask about the possibilities to do some basic manipulation
    > on timestamps - such as incrementing a given time (hour.minute -
    > string) by some minutes.
    > Very basic notion of "time" is assumed, i.e. dateless,
    > timezone-unaware, DST-less etc.
    > I first thought, it would be possible to just add a timedelta to a
    > time object, but, it doesn't seem to be the case.


    That's correct. A datetime.time object is a time within a day.
    A datetime.date object is a date without a time. A datetime.datetime
    object contains both.

    You can add a datetime.timedelta object to a datetime.datetime
    object, which will yield a datetime.datetime object.

    You can also call time.time(), and get the number of seconds
    since the epoch (usually 1970-01-01 00:00:00 UTC). That's just
    a number, and you can do arithmetic on that.

    Adding a datetime.time to a datetime.timedelta isn't that
    useful. It would have to return a value error if the result
    crossed a day boundary.

    John Nagle
     
    John Nagle, Jul 5, 2012
    #4
  5. Vlastimil Brom

    Guest

    On Thursday, July 5, 2012 11:34:16 AM UTC-6, John Nagle wrote:
    >[...]
    > You can also call time.time(), and get the number of seconds
    > since the epoch (usually 1970-01-01 00:00:00 UTC). That's just
    > a number, and you can do arithmetic on that.
    >
    > Adding a datetime.time to a datetime.timedelta isn't that
    > useful.


    It certainly is useful and I gave an obvious and real-
    world example in my previous post.

    > It would have to return a value error if the result
    > crossed a day boundary.


    Why? When I turn the adjustment knob on my analog
    clock it crosses the day boundary from 23:59 to 0:00
    with no problem whatsoever. Why is Python unable
    to do what billions of clocks do?

    Instead I have to convert everything to seconds and
    do the same math I would have done in fortran in 1980.
    Phew.

    Another example of Pythonic "purity beats practicality"
     
    , Jul 5, 2012
    #5
  6. On Thu, 05 Jul 2012 11:15:04 -0700, rurpy wrote:

    > On Thursday, July 5, 2012 11:34:16 AM UTC-6, John Nagle wrote:
    >>[...]
    >> You can also call time.time(), and get the number of seconds
    >> since the epoch (usually 1970-01-01 00:00:00 UTC). That's just a
    >> number, and you can do arithmetic on that.
    >>
    >> Adding a datetime.time to a datetime.timedelta isn't that
    >> useful.

    >
    > It certainly is useful and I gave an obvious and real- world example in
    > my previous post.


    Agreed.

    A timedelta of less than one day magnitude should be usable with time
    objects, and wrap around at midnight. That's a clear and useful extension
    to the current functionality.

    I can't see a feature request (rejected or otherwise) on the bug tracker.
    Perhaps you should raise one for Python 3.4. It will have a better chance
    of being accepted if you include a patch, or at least tests.

    http://bugs.python.org/



    --
    Steven
     
    Steven D'Aprano, Jul 6, 2012
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Chris Angelico

    Re: simpler increment of time values?

    Chris Angelico, Jul 5, 2012, in forum: Python
    Replies:
    0
    Views:
    173
    Chris Angelico
    Jul 5, 2012
  2. Mark Lawrence

    Re: simpler increment of time values?

    Mark Lawrence, Jul 5, 2012, in forum: Python
    Replies:
    0
    Views:
    183
    Mark Lawrence
    Jul 5, 2012
  3. Jason Friedman

    Re: simpler increment of time values?

    Jason Friedman, Jul 5, 2012, in forum: Python
    Replies:
    0
    Views:
    165
    Jason Friedman
    Jul 5, 2012
  4. Devin Jeanpierre

    Re: simpler increment of time values?

    Devin Jeanpierre, Jul 5, 2012, in forum: Python
    Replies:
    0
    Views:
    198
    Devin Jeanpierre
    Jul 5, 2012
  5. Vlastimil Brom

    Re: simpler increment of time values?

    Vlastimil Brom, Jul 5, 2012, in forum: Python
    Replies:
    0
    Views:
    170
    Vlastimil Brom
    Jul 5, 2012
Loading...

Share This Page