2017-10-14 53 views
0

我试图计算Python中两个日期之间的差异,并用天,周,月和年表示这个时间差。Python:两次之差

我的Python代码如下:

purDate = datetime.datetime.strptime(queryPurchaseDate (purID), "%Y-%m-%d %H:%M:%S") 
    now = datetime.datetime.now() 

    print 'Purchase date/time : ',purDate.strftime("%Y-%m-%d %H:%M:%S") 
    print 'Current date/time : ',now.strftime("%Y-%m-%d %H:%M:%S") 

    hold = now - purDate  

    print hold 

此代码的结果如下:

bash-3.2$ ./test.py 
Purchase date/time : 2017-10-10 00:00:00 
Current date/time : 2017-10-14 17:33:39 
4 days, 17:33:39.866069 
bash-3.2$ 

代替具有两个日期之间的差的表示为 4天,17 :33:39.866069 我想表达如下: 4.65天或 0.66周或 0.15个月或 0.01岁

回答

2

两个datetime对象之间的差异是一个timedelta对象。您可以在几秒钟内表达这种差异,然后在一天/一周/一年/一年中使用总秒数的定义来计算您的比率。

>>> diff = timedelta(days=4, seconds=17 * 3600 + 33 * 60 + 39.866069) 
>>> print(diff) 
4 days, 17:33:39.866069 
>>> diff.total_seconds()/86400 
4.731711412835648 
>>> diff.total_seconds()/(86400 * 7) 
0.6759587732622354 
>>> diff.total_seconds()/(86400 * 30) 
0.15772371376118827 
>>> diff.total_seconds()/(86400 * 365) 
0.012963592911878487 

这种方法稍微简单一些,因为它没有考虑月份或闰年的不规律性。 365和366天之间的差异不应显示在您想要的准确度内,因此您可以忽略它。对于这几个月,你是否希望30天保持一个月的连续性,或者你希望在2017年1月8日至2017年1月9日之间登记为一个月?这会使事情变得复杂,精确度至多提高0.01。

def timedelta_to(time_diff, unit='day'): 
    options = {'day': 86400, 
     'week': 86400 * 7, 
     'month': 86400 * 30, 
     'year': 86400 * 365, 
     } 
    # default to days for an invalid unit of choice, 
    # though warning to user might be another option 
    if unit not in options: 
     unit = 'day' 
    duration = time_diff.total_seconds()/options[unit] 
    return '{0:.2f} {1}s'.format(duration, unit.title()) 

你可以像这样使用它。

>>> timedelta_to(diff) 
'4.73 Days' 
>>> timedelta_to(diff, 'month') 
'0.16 Months' 
+0

这样比较好。我不知道这个差别是默认的'timedelta' – akilat90

1

可以使用熊猫转换为timedelta对象,然后进行后续的数学运算

delta = pd.Timedelta(delta) 
delta.total_seconds()/(24*60*60) # this will give the timedelta in days 

演示

import pandas as pd 
import datetime 

time1 = datetime.datetime.now() 
time2 = '2017-10-01 00:00:00' 
time2 = pd.to_datetime(time2) 

delta = time1 - time2 
print(delta) 
13 days 22:03:50.081000 

delta = pd.Timedelta(delta) 
print(delta.total_seconds()/(24*60*60)) 
13.909289537037038 

编辑:

不需要使用熊猫。正如@Reti43解释的那样,您可以使用delta.total_seconds()/(24*60*60)