Python - Contar fechas

 
Vista:
sin imagen de perfil

Contar fechas

Publicado por David (9 intervenciones) el 16/11/2017 08:48:08
Hola, me piden realizar el siguiente ejercicio:

Escribe una función dias_entre_fechas que acepta dos argumentos de tipo tupla de tres enteros. Cada tupla representa una fecha en formato (día, mes, año). La función debe devolver el número de días que hay entre las dos fechas.

Nota: no se puede utilizar el módulo datetime.

Por ejemplo: Entre las fechas (21, 3,2000), (24,10,2016) debe devolver 6061 dias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Contar fechas

Publicado por kip (257 intervenciones) el 17/11/2017 04:09:04
Hola, es una tarea algo complicada hacer lo que pides, sobre todo cuando el lenguaje ya provee algo para hacerlo de manera segura y sin problemas, de todas formas he encontrado esto que viene muy bien, aplica una lógica fácil de entender así que he hecho algo simple basándome en aquellos datos(uso Python3):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
def diff_days(date1, date2):
    daysDiff = 0
    month31Day = 1, 3, 5, 7, 8, 10, 12
 
    def normalizeDate(dates):
        dates = list(map(list, dates))
        years = dates[2]
        months = dates[1]
        days = dates[0]
        if months[0] > months[1]:
            months[1] +=  12
            years[1] -= 1
        if days[0] > days[1]:
            months[1] -= 1
            days[1] += 30
        finalDate = (
            (days[1] - days[0], 'd'),
            (months[1] - months[0], 'm'),
            (years[1] - years[0], 'y'),
        )
        return finalDate
 
    dateNormalized = normalizeDate(zip(date1, date2))
 
    daysDiff = sum(
        map(
            lambda v: (
                v[0] * 30 if v[1] == 'm' else
                (v[0] * 365 if v[1] == 'y' else v[0])
            ),
            dateNormalized
        )
    )
 
    leapYear = lambda year: (year % 100 and not year % 4)\
        or not year % 400
 
    for n in range(dateNormalized[2][0] + 1):
        year = date1[2] + n
        if leapYear(year):
            daysDiff += 1
 
    for n in range(dateNormalized[1][0] + 1):
        month = date1[1] + n
        month = month - 12 if month > 12 else month
        if month == date2[1]:
            break
        if month == 2:
            if leapYear(date2[2]):
                daysDiff += 1
            daysDiff -= 2
        if month in month31Day:
            daysDiff += 1
 
    return daysDiff

La función claramente es larga, se podría crear tal vez una clase para manejar este tipo de cosas y mantener un buen orden pero así lo necesitas no ?

Ahora bien, vamos a probarla:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from datetime import date
 
def diff_days_datetime(date1, date2):
    d1 = date(*reversed(date1))
    d0 = date(*reversed(date2))
    delta = d0 - d1
    return delta.days
 
datesToCalc = (
    ((15, 10, 2007), (3, 3, 2012)),
    ((25, 1, 2009), (3, 3, 2009)),
    ((1, 1, 2011), (1, 2, 2011)),
    ((1, 1, 2016), (1, 1, 2017))
)
 
for dateToCalc in datesToCalc:
    print(
        'Days manual = {}, Days with module = {}'.format(
            diff_days(*dateToCalc),
            diff_days_datetime(*dateToCalc)
        )
    )

He creado otra pequeña función para usar el modulo datetime, el cual me ofrece la clase date para poder realizar este tipo de operacion, esto es lo que nos mostrara:

1
2
3
4
Days manual = 1601, Days with module = 1601
Days manual = 37, Days with module = 37
Days manual = 31, Days with module = 31
Days manual = 366, Days with module = 366

La lógica que coloque mas arriba parece ser muy buena, te recomiendo leas el enlace y de seguro podrás crear tu propia función o clase...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar