date diff calc

Discussion in 'Python' started by tertius, Nov 29, 2004.

  1. tertius

    tertius Guest

    Hi,

    Is there a more pythonic way to write or do a date difference
    calculation? I have as input two date fields in the form 'YYYY-MM-DD'

    TIA
    Terius



    from datetime import date

    bdl = '2004-11-25'.split('-')
    edl = '2004-11-30'.split('-')
    bd = date(int(bdl[0]), int(bdl[1]), int(bdl[2]))
    ed = date(int(edl[0]), int(edl[1]), int(edl[2]))

    print ed , '-', bd , '=', (ed-bd).days
     
    tertius, Nov 29, 2004
    #1
    1. Advertising

  2. > bdl = '2004-11-25'.split('-')
    > edl = '2004-11-30'.split('-')
    > bd = date(int(bdl[0]), int(bdl[1]), int(bdl[2]))
    > ed = date(int(edl[0]), int(edl[1]), int(edl[2]))


    using time.strptime and datetime.date.fromtimestamp is surely the better
    alternative, as it lets specify you the format by a string.

    > print ed , '-', bd , '=', (ed-bd).days


    I can't imagine what could possibly be easier than subtracting two dates -
    in fact, most times one has to jump through much more hoops to achieve
    these results, e.g. in java.

    --
    Regards,

    Diez B. Roggisch
     
    Diez B. Roggisch, Nov 29, 2004
    #2
    1. Advertising

  3. tertius

    tertius Guest

    Diez B. Roggisch wrote:
    >
    > I can't imagine what could possibly be easier than subtracting two dates -
    > in fact, most times one has to jump through much more hoops to achieve
    > these results, e.g. in java.
    >

    I'll try that.

    Thanks,
    T
     
    tertius, Nov 29, 2004
    #3
  4. tertius> Is there a more pythonic way to write or do a date difference
    tertius> calculation? I have as input two date fields in the form
    tertius> 'YYYY-MM-DD'

    How about:

    import datetime
    import time

    bd = "2004-11-25"
    ed = "2004-11-30"

    start = datetime.date.fromtimestamp(time.strptime("%Y-%m-%d", bd))
    end = datetime.date.fromtimestamp(time.strptime("%Y-%m-%d", ed))

    print ed , '-', bd , '=', (end-start).days

    I think that for completeness' sake it would be nice if datetime exposed a
    fromstring method which accepted a string representing a date and a format
    specifier, e.g.:

    start = datetime.date.fromstring("%Y-%m-%d", "2004-11-25")
    end = datetime.date.fromstring("%Y-%m-%d", "2004-11-30")

    (Maybe it should be called "strptime", since that's the call it's saving.)

    The datetime.date object already exposes a strftime method for generating a
    formatted string output and will create date objects from both time.time()
    output (fromtimestamp) and "proleptic Gregorian ordinal"s (fromordinal).
    Looking at the datetime module docs, it's not at all obvious to me that the
    latter would be used all that often. I think inputs from strings would be
    much more common.

    Skip
     
    Skip Montanaro, Nov 29, 2004
    #4
  5. tertius

    Rick Holbert Guest

    Here's how to do it as a one-liner:

    python -c "import datetime; import time; print 'Only %d days until
    Christmas' % (datetime.date(2004, 12, 25) -
    datetime.date.fromtimestamp(time.time())).days"

    Here's a slightly shorter way of doing it:

    python -c "import time; print 'Only %f more days until Christmas' %
    (float(time.mktime(time.strptime('2004-12-25', '%Y-%m-%d')) -
    time.time()) / 86400)"
     
    Rick Holbert, Nov 29, 2004
    #5
  6. tertius

    Tim Peters Guest

    [Skip Montanaro]
    > ...
    > The datetime.date object already exposes a strftime method for
    > generating a formatted string output and will create date objects
    > from both time.time() output (fromtimestamp) and "proleptic
    > Gregorian ordinal"s (fromordinal). Looking at the datetime module
    > docs, it's not at all obvious to me that the latter would be used all
    > that often.


    Then the part of the docs you're overlooking is the part explaining
    that "Calendrical Calculations" bases all its calendar conversions on
    proleptic Gregorian ordinals. They're for people who want something
    other than the Gregorian calendar, and want it enough to write some
    code.

    > I think inputs from strings would be much more common.


    Me too, although it's a bottomless pit.

    guess-6-intended-meanings-for-1/2/3-before-breakfast-ly y'rs
     
    Tim Peters, Nov 30, 2004
    #6
  7. tertius

    Peter Hansen Guest

    Tim Peters wrote:
    > [Skip Montanaro]
    >>I think inputs from strings would be much more common.

    >
    > Me too, although it's a bottomless pit.
    >
    > guess-6-intended-meanings-for-1/2/3-before-breakfast-ly y'rs


    I think Skip was intending that the format string be mandatory,
    to avoid such ambiguity. At least, that's what I inferred from
    his example, where the format string came before the date string:

    start = datetime.date.fromstring("%Y-%m-%d", "2004-11-25")

    -Peter
     
    Peter Hansen, Nov 30, 2004
    #7
  8. tertius

    Tim Peters Guest

    [Skip Montanaro]
    >>> I think inputs from strings would be much more common.


    [Tim Peters]
    >> Me too, although it's a bottomless pit.
    >>
    >> guess-6-intended-meanings-for-1/2/3-before-breakfast-ly y'rs


    [Peter Hansen]
    > I think Skip was intending that the format string be mandatory,
    > to avoid such ambiguity. At least, that's what I inferred from
    > his example, where the format string came before the date string:
    >
    > start = datetime.date.fromstring("%Y-%m-%d", "2004-11-25")


    It's still a bottomless pit -- ask Brett, who implemented the Python
    strptime <wink>. But now that we *have* a portable strptime
    implementation, perhaps it would be OK to teach datetime about it.

    OTOH, is that what people really want? For all I know,
    rfc822.getdate() or rfc822.getdate_tz() are what's really wanted, or
    maybe some DWIM thing like Zope's date guessers.

    Does anyone want any of those enough to write the code, tests, and
    docs? If so, the first person to do so will probably win the debate
    ....
     
    Tim Peters, Nov 30, 2004
    #8
  9. tertius

    Peter Hansen Guest

    Tim Peters wrote:
    > [Peter Hansen]
    >>I think Skip was intending that the format string be mandatory,
    >>to avoid such ambiguity.

    >
    > It's still a bottomless pit -- ask Brett, who implemented the Python
    > strptime <wink>.


    True, I did overlook timezones at the time.

    On the other hand, that's because *my* use cases for "simple"
    fromstring() behaviour are all involving local time. When
    I'm interested in non-local time, I would be happy having
    to specify that behaviour in a more complex manner.

    > OTOH, is that what people really want? For all I know,
    > rfc822.getdate() or rfc822.getdate_tz() are what's really wanted, or
    > maybe some DWIM thing like Zope's date guessers.


    To each his own, although I think there's a hope here that
    for those who might need/want a really simple solution,
    95% of people have this in mind (pseudo-code):

    class datetime.date:
    def fromstring(format, string):
    ts = time.mktime(time.strptime(string, format))
    return datetime.date.fromtimestamp(ts)

    The .fromtimestamp() methods already work only for local
    time, and I haven't heard anyone complaining about that
    either. (Hmm... haven't been listening either though. :)

    -Peter
     
    Peter Hansen, Nov 30, 2004
    #9
  10. tertius

    David Fraser Guest

    Peter Hansen wrote:
    > Tim Peters wrote:
    >
    >> [Peter Hansen]
    >>
    >>> I think Skip was intending that the format string be mandatory,
    >>> to avoid such ambiguity.

    >>
    >>
    >> It's still a bottomless pit -- ask Brett, who implemented the Python
    >> strptime <wink>.

    >
    >
    > True, I did overlook timezones at the time.
    >
    > On the other hand, that's because *my* use cases for "simple"
    > fromstring() behaviour are all involving local time. When
    > I'm interested in non-local time, I would be happy having
    > to specify that behaviour in a more complex manner.
    >
    >> OTOH, is that what people really want? For all I know,
    >> rfc822.getdate() or rfc822.getdate_tz() are what's really wanted, or
    >> maybe some DWIM thing like Zope's date guessers.

    >
    >
    > To each his own, although I think there's a hope here that
    > for those who might need/want a really simple solution,
    > 95% of people have this in mind (pseudo-code):
    >
    > class datetime.date:
    > def fromstring(format, string):
    > ts = time.mktime(time.strptime(string, format))
    > return datetime.date.fromtimestamp(ts)
    >


    Hear, hear, the above would be great!
     
    David Fraser, Dec 2, 2004
    #10
    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. Cyril Vi?ville

    diff Process under diff users

    Cyril Vi?ville, Jun 29, 2004, in forum: Perl
    Replies:
    1
    Views:
    523
    Joe Smith
    Jun 29, 2004
  2. Berrucho
    Replies:
    2
    Views:
    668
    Infant Newbie
    Dec 5, 2003
  3. A Traveler

    Diff CSS styles for diff INPUT TYPE='s?

    A Traveler, Aug 31, 2004, in forum: ASP .Net
    Replies:
    6
    Views:
    4,958
    Steve Fulton
    Aug 31, 2004
  4. Kaye Ng

    ruby calc.rb or just calc.rb

    Kaye Ng, Jul 26, 2010, in forum: Ruby
    Replies:
    7
    Views:
    429
    Kaye Ng
    Jul 28, 2010
  5. Bob
    Replies:
    1
    Views:
    303
    Paul Lalli
    Sep 1, 2005
Loading...

Share This Page