Разница между двумя датами в Python

139

У меня две разные даты, и я хочу знать разницу в днях между ними. Формат даты - ГГГГ-ММ-ДД.

У меня есть функция, которая может ДОБАВИТЬ или ВЫЧИТАТЬ заданное число к дате:

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 - количество дней, которые я хочу добавить. И результат - другое свидание.

Мне нужна функция, в которой я могу указать две даты, и результатом будет int с разницей в датах в днях.

mauguerra
источник
Обратите внимание, что ваша функция addonDays не будет работать в дни летнего времени.
fishinear
Ты прав. Я уже модифицировал функцию. Если добавить 3600 (один час) будет работать.
маугерра

Ответы:

275

Используйте, -чтобы увидеть разницу между двумя 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 07
У меня эта ошибка на консоли: объект типа datetime.datetime не имеет атрибута strptime
маугерра
2
Я получаю TypeError: объект 'int' не вызывается, когда я пытаюсь выполнить .days () для объекта timedelta, и в документации об этом также не упоминается ( docs.python.org/2/library/datetime.html ).
user1761806
4
Не могли бы вы total_secondsтоже упомянуть ? Я думаю, что это важно, поскольку это то, что я ожидал получить, когда попробовал, secondsне читая документации.
Мартин Тома
1
@ThejKiran Сделайте d2 и d1 разделенными ровно на один день и посмотрите, соответствует ли это вашим ожиданиям ;-)
Мартин Тома
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()
0x8BADF00D
источник
3
Разве функция ifin diff_datesсовершенно не нужна? По определению абсолютного значения abs(date1-date2)всегда будет равно abs(date2-date1).
Blckknght
По крайней мере, с Python3.5 оператор печати должен выглядеть так: print ('{} дней между {} и {}'. Format (result1, d1, d2))
Эрнестас Кардзис
2

Я пробовал код, опубликованный larsmans выше, но есть несколько проблем:

1) Код в том виде, в каком он есть, выдает ошибку, как упомянул Маугерра 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
schalkneethling
источник
1
Мой код использует datetime.strptimeдля преобразования строк в datetimeобъекты. Поскольку в OP указано, что «Формат даты - ГГГГ-ММ-ДД», я предположил, что даты представлены в виде строк. В противном случае, очевидно, нет необходимости в преобразовании.
Фред Фу
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()
user8359392
источник
-4

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

ar91
источник