2010-06-28 18 views
9

ho dato stringhe di data come questi:Python data leggibile differenza

Mon Jun 28 10:51:07 2010 
Fri Jun 18 10:18:43 2010 
Wed Dec 15 09:18:43 2010 

Che è un modo pitone comoda per calcolare la differenza di giorni? Supponendo che il fuso orario sia lo stesso.

Le stringhe sono state restituite dai comandi linux.

Edit: Grazie, tante buone risposte

risposta

5
#!/usr/bin/env python 

import datetime 

def hrdd(d1, d2): 
    """ 
    Human-readable date difference. 
    """ 
    _d1 = datetime.datetime.strptime(d1, "%a %b %d %H:%M:%S %Y") 
    _d2 = datetime.datetime.strptime(d2, "%a %b %d %H:%M:%S %Y") 
    diff = _d2 - _d1 
    return diff.days # <-- alternatively: diff.seconds 

if __name__ == '__main__': 
    d1 = "Mon Jun 28 10:51:07 2010" 
    d2 = "Fri Jun 18 10:18:43 2010" 
    d3 = "Wed Dec 15 09:18:43 2010" 

    print hrdd(d1, d2) 
    # ==> -11 
    print hrdd(d2, d1) 
    # ==> 10 
    print hrdd(d1, d3) 
    # ==> 169 
    # ... 
6

Utilizzare strptime.

utilizzo Esempio:

from datetime import datetime 

my_date = datetime.strptime('Mon Jun 28 10:51:07 2010', '%a %b %d %H:%M:%S %Y') 
print my_date 

EDIT:

Si potrebbe anche stampare la differenza di tempo in una forma leggibile, in questo modo:

from time import strptime 
from datetime import datetime 

def date_diff(older, newer): 
    """ 
    Returns a humanized string representing time difference 

    The output rounds up to days, hours, minutes, or seconds. 
    4 days 5 hours returns '4 days' 
    0 days 4 hours 3 minutes returns '4 hours', etc... 
    """ 

    timeDiff = newer - older 
    days = timeDiff.days 
    hours = timeDiff.seconds/3600 
    minutes = timeDiff.seconds%3600/60 
    seconds = timeDiff.seconds%3600%60 

    str = "" 
    tStr = "" 
    if days > 0: 
     if days == 1: tStr = "day" 
     else:   tStr = "days" 
     str = str + "%s %s" %(days, tStr) 
     return str 
    elif hours > 0: 
     if hours == 1: tStr = "hour" 
     else:   tStr = "hours" 
     str = str + "%s %s" %(hours, tStr) 
     return str 
    elif minutes > 0: 
     if minutes == 1:tStr = "min" 
     else:   tStr = "mins"   
     str = str + "%s %s" %(minutes, tStr) 
     return str 
    elif seconds > 0: 
     if seconds == 1:tStr = "sec" 
     else:   tStr = "secs" 
     str = str + "%s %s" %(seconds, tStr) 
     return str 
    else: 
     return None 

older = datetime.strptime('Mon Jun 28 10:51:07 2010', '%a %b %d %H:%M:%S %Y') 
newer = datetime.strptime('Tue Jun 28 10:52:07 2010', '%a %b %d %H:%M:%S %Y') 
print date_diff(older, newer) 

Original source per il frammento di tempo .

5
>>> import datetime 
>>> a = datetime.datetime.strptime("Mon Jun 28 10:51:07 2010", "%a %b %d %H:%M:%S %Y") 
>>> b = datetime.datetime.strptime("Fri Jun 18 10:18:43 2010", "%a %b %d %H:%M:%S %Y") 
>>> c = a-b 
>>> c.days 
10 
0

Prova questo:

>>> (datetime.datetime.strptime("Mon Jun 28 10:51:07 2010", "%a %b %d %H:%M:%S %Y") - datetime.datetime.strptime("Fri Jun 18 10:18:43 2010", "%a %b %d %H:%M:%S %Y")).days 
10 
0
from datetime import datetime 

resp = raw_input("What is the first date ?") 
date1 = datetime.strptime(resp,"%a %b %d %H:%M:%S %Y") 
resp2 = raw_input("What is the second date ?") 
date2 = datetime.strptime(resp2,"%a %b %d %H:%M:%S %Y") 
res = date2-date1 
print str(res) 

Per i dettagli su come stampare un oggetto timedelta meglio, si può vedere this previous post.

2

Questo non corrisponde alle altre risposte, ma potrebbe essere utile a qualcuno che desidera visualizzare qualcosa di più leggibile (e meno preciso). L'ho fatto rapidamente, quindi i suggerimenti sono benvenuti.

(Notare che assume until_seconds è il timestamp successivo.)

def readable_delta(from_seconds, until_seconds=None): 
    '''Returns a nice readable delta. 

    readable_delta(1, 2)   # 1 second ago 
    readable_delta(1000, 2000)  # 16 minutes ago 
    readable_delta(1000, 9000)  # 2 hours, 133 minutes ago 
    readable_delta(1000, 987650) # 11 days ago 
    readable_delta(1000)   # 15049 days ago (relative to now) 
    ''' 

    if not until_seconds: 
     until_seconds = time.time() 

    seconds = until_seconds - from_seconds 
    delta = datetime.timedelta(seconds=seconds) 

    # deltas store time as seconds and days, we have to get hours and minutes ourselves 
    delta_minutes = delta.seconds // 60 
    delta_hours = delta_minutes // 60 

    ## show a fuzzy but useful approximation of the time delta 
    if delta.days: 
     return '%d day%s ago' % (delta.days, plur(delta.days)) 
    elif delta_hours: 
     return '%d hour%s, %d minute%s ago' % (delta_hours, plur(delta_hours), delta_minutes, plur(delta_minutes)) 
    elif delta_minutes: 
     return '%d minute%s ago' % (delta_minutes, plur(delta_minutes)) 
    else: 
     return '%d second%s ago' % (delta.seconds, plur(delta.seconds)) 

def plur(it): 
    '''Quick way to know when you should pluralize something.''' 
    try: 
     size = len(it) 
    except TypeError: 
     size = int(it) 
    return '' if size==1 else 's' 
Problemi correlati