определение функции, которая дает мне расстояние между 2 датами - PullRequest
0 голосов
/ 22 октября 2018

введите описание изображения здесь

Мне нужно написать фрагмент кода, который вычисляет расстояние между двумя датами, как показано на скриншоте выше ^

Эточто я положил:

def dist2dates(date1,date2):
    result= date2[0:2]-date1[0:2],"/",date2[3:]-date1[3:]
    return result

res2=dist2dates(1116,1129)
print(res2)

Это приводит к ошибке, которая говорит:

TypeError: 'int' object is not subscriptable

Я не слишком уверен, что я делаю неправильно.Кроме того, я не слишком ясно, как поставить дату, такую ​​как "08/16" в аргументе?Может кто-нибудь помочь мне определить такую ​​функцию?

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Природа этой проблемы довольно странная, поскольку теперь в вашем году 360 дней, но эта структура обрабатывает оба значения: если первая дата больше или меньше, она работает, оценивая разницу в днях на основе 30-дневных месяцев, а затем преобразует ихв дни и использует zfill для печати вывода.

def dist2dates(a, b):
    a = list(map(int, a.split('/')))
    b = list(map(int, b.split('/')))
    if b[0] < a[0]:
        days = 360 - 30*(a[0] - b[0]) - (a[1] - b[1])
    else:
        days = 30*((b[0]- 1) - a[0]) + (30 - a[1]) + b[1]
    print(days)
    tup = divmod(days,30)
    mm, dd = tup[0], tup[1]    
    return f'{str(mm).zfill(2)}/{str(dd).zfill(2)}'

print(dist2dates('03/20', '01/10')) # => 09/20
print(dist2dates('01/12', '05/20')) # => 04/08
0 голосов
/ 22 октября 2018

почему бы не использовать модуль datetime для вычисления timedelta и использовать strptime / strftime для форматирования?

from datetime import datetime, timedelta

def dist2dates(strdate1,strdate2):
    '''format mm/dd, assumes month = 30 days always'''
    dtfmt = '%m/%d'
    date1 = datetime.strptime(strdate1, dtfmt)
    date2 = datetime.strptime(strdate2, dtfmt)
    delta = date2 - date1
    year = date1.year
    month, day = divmod(delta.days, 30)
    result = datetime.strftime(datetime(year, round(month), round(day)), '%m/%d')
    return result

res = dist2dates('01/16','11/29')
print(res)
# 10/13
0 голосов
/ 22 октября 2018

Это лучшее, что я мог придумать:

import re

def dist2dates(date1,date2):
    if re.match(r'^\d{2}\/\d{2}$', date1) and re.match(r'^\d{2}\/\d{2}$', date2):
        diff1 = abs(((int(date2[0:2])-int(date1[0:2]))))
        diff2 = abs((int(date2[3:])-int(date1[3:])))
        result= ("%02d/%02d") %(diff1, diff2)
        return result
    else:
        return "Incorrect format"

res2=dist2dates("11/16","11/29")
print(res2)

Вывод:

00/13

Он всегда возвращает абсолютное значение abs (), поэтому вы не получите отрицательные числа.Он также проверяет, правильно ли отформатирована строка даты с использованием RegEx.

=================== Перед редактированием =================

Попробуйте:

def dist2dates(date1,date2):

    result= ("%02d/%02d") %(int(date2[0:2])-int(date1[0:2]) ,int(date2[3:])-int(date1[3:]))
    return result

res2=dist2dates("10/16","11/29")
print(res2)

Вывод:

01/13

Входные данные для функции dist2dates должны быть строками, а не целыми числами.

Приведите строки в целые числа, чтобы вы могли вычесть числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...