Python 中两个日期之间的差异

230

我有两个不同的日期,想知道它们之间相差几天。日期的格式为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(一个小时),它就会起作用。 - mauguerra
7个回答

448

使用 - 操作符对两个 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)

62
好的回答。需要明确的是,(d2 - d1) 的结果将会是一个 timedelta 对象。 - aganders3
1
我在控制台上看到了这个错误: 类型对象“datetime.datetime”没有属性“strptime”。 - mauguerra
3
当我尝试在timedelta对象上执行.days()时,会出现TypeError: 'int' object is not callable错误。文档中也没有提到这一点。(https://docs.python.org/2/library/datetime.html) - Reddspark
8
请你也提及total_seconds函数,因为当我在没有阅读文档的情况下尝试使用seconds函数时,实际上我期望得到的是total_seconds函数的返回结果,所以这很重要。 - Martin Thoma
1
@MartinThoma 我开始觉得库里有个bug。seconds属性的限制应该是一个警示标志。 - Christian Pao.
显示剩余6条评论

48

另一个简短的解决方案:

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
diff_dates 函数中的 if 语句完全没有必要吗?根据绝对值的定义,abs(date1-date2) 总是等于 abs(date2-date1) - Blckknght
至少在Python3.5中,print语句应该像这样: print ('{}天在{}和{}之间'.format(result1, d1, d2)) - Ernestas Kardzys

10
你可以使用第三方库dateutil,它是内置datetime的扩展。
使用parser模块解析日期非常简单:
from dateutil import parser

date1 = parser.parse('2019-08-01')
date2 = parser.parse('2019-08-20')

diff = date2 - date1

print(diff)
print(diff.days)

答案基于this deleted duplicate的答案


6
我尝试了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”,我假设日期表示为字符串。如果它们不是,那么显然就不需要进行转换了。 - Fred Foo

2

试试这个:

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()

-2

我尝试了几个代码,但最终使用了如下简单的代码(在Python 3中):

from datetime import datetime
df['difference_in_datetime'] = abs(df['end_datetime'] - df['start_datetime'])

如果您的 start_datetimeend_datetime 列以 datetime64[ns] 格式表示,datetime 可以理解并返回以天数和时间戳相加的差异,格式为 timedelta64[ns]
如果您只想查看天数的差异,您可以通过使用以下方法仅分离 start_datetimeend_datetime日期部分(也适用于时间部分):
df['start_date'] = df['start_datetime'].dt.date
df['end_date'] = df['end_datetime'].dt.date

然后运行:

df['difference_in_days'] = abs(df['end_date'] - df['start_date'])

-5

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


请以某种方式更正答案,以恢复被取消赞成票的声誉。 - ruslan_krivoshein
建议一些不使用“pandas”的编程方案。 - ruslan_krivoshein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接