Python中两个日期之间的差异


137

我有两个不同的日期,我想知道它们之间的天数差异。日期格式为YYYY-MM-DD。

我有一个可以在日期中添加或减去给定数字的功能:

def addonDays(a, x):
   ret = time.strftime("%Y-%m-%d",time.localtime(time.mktime(time.strptime(a,"%Y-%m-%d"))+x*3600*24+3600))      
   return ret

其中A是日期,x是我要添加的天数。结果是另一个日期。

我需要一个可以给出两个日期的函数,结果将是一个以天为单位的日期差的整数。



请注意,您的addonDays函数将在夏令时结束。
fishinear

你是对的。我已经修改了功能。如果您添加3600(一小时)将起作用。
马拉加

Answers:


270

使用-得到两者之间的区别datetime对象,并采取days会员。

from datetime import datetime

def days_between(d1, d2):
    d1 = datetime.strptime(d1, "%Y-%m-%d")
    d2 = datetime.strptime(d2, "%Y-%m-%d")
    return abs((d2 - d1).days)

37
好答案。要明确的是,的结果(d2 - d1)将是一个timedelta对象。
aganders3 2011年

我有控制台上的错误:对象类型“datetime.datetime”有没有属性“strptime”
mauguerra

2
我收到TypeError:当我尝试对timedelta对象执行.days()时,'int'对象不可调用,并且文档也未提及它(docs.python.org/2/library/datetime.html)。
1761806

4
total_seconds也可以提一下吗?我认为这很重要,因为这是我在seconds不阅读文档的情况下期望得到的结果。
马丁·托马

1
@ThejKiran让d2和d1完全分开一天,看看它是否符合您的期望;-)
Martin Thoma

27

另一个简短的解决方案:

from datetime import date

def diff_dates(date1, date2):
    return abs(date2-date1).days

def main():
    d1 = date(2013,1,1)
    d2 = date(2013,9,13)
    result1 = diff_dates(d2, d1)
    print '{} days between {} and {}'.format(result1, d1, d2)
    print ("Happy programmer's day!")

main()

3
函数if中的diff_dates功能不是完全不必要的吗?根据绝对值的定义,abs(date1-date2)将始终等于abs(date2-date1)
Blckknght

至少在Python3.5中,打印语句应如下所示:print({}和{}'。format(result1,d1,d2)之间的'{}天”)
Ernestas Kardzys

2

我尝试了上面larsmans发布的代码,但是有两个问题:

1)原样的代码将引发mauguerra提到的错误2)如果将代码更改为以下内容:

...
    d1 = d1.strftime("%Y-%m-%d")
    d2 = d2.strftime("%Y-%m-%d")
    return abs((d2 - d1).days)

这会将您的datetime对象转换为字符串,但是有两件事

1)尝试执行d2-d1将失败,因为您无法在字符串上使用减号运算符,并且2)如果阅读了上述答案的第一行,则想在两个datetime对象上使用-运算符,但是将它们转换为字符串

我发现您实际上只需要以下内容:

import datetime

end_date = datetime.datetime.utcnow()
start_date = end_date - datetime.timedelta(days=8)
difference_in_days = abs((end_date - start_date).days)

print difference_in_days

1
我的代码用于datetime.strptime将字符串转换为datetime对象。由于OP指出“日期的格式为YYYY-MM-DD”,因此我假定日期以字符串表示。如果不是,那么显然不需要转换。
弗雷德·福

0

试试这个:

data=pd.read_csv('C:\Users\Desktop\Data Exploration.csv')
data.head(5)
first=data['1st Gift']
last=data['Last Gift']
maxi=data['Largest Gift']
l_1=np.mean(first)-3*np.std(first)
u_1=np.mean(first)+3*np.std(first)


m=np.abs(data['1st Gift']-np.mean(data['1st Gift']))>3*np.std(data['1st Gift'])
pd.value_counts(m)
l=first[m]
data.loc[:,'1st Gift'][m==True]=np.mean(data['1st Gift'])+3*np.std(data['1st Gift'])
data['1st Gift'].head()




m=np.abs(data['Last Gift']-np.mean(data['Last Gift']))>3*np.std(data['Last Gift'])
pd.value_counts(m)
l=last[m]
data.loc[:,'Last Gift'][m==True]=np.mean(data['Last Gift'])+3*np.std(data['Last Gift'])
data['Last Gift'].head()

-4

pd.date_range('2019-01-01','2019-02-01')。shape [0]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.