python - example - Enumere los elementos en el formato de tiempo y calcule el tiempo dif a partir de hoy
timedelta python example (4)
Este código de Python 2 / Python 3 es una combinación de las respuestas de Martijn y Tagc.
from datetime import datetime
def parse_dates(dates_array):
today = datetime.today()
for d in dates_array:
yield (today - datetime(*map(int, d))).days
if __name__ == ''__main__'':
dates = [
[''2017'', ''01'', ''15''],
[''2017'', ''01'', ''14''],
[''2017'', ''01'', ''13''],
]
for d in parse_dates(dates):
print(d)
salida
4
5
6
Como dijo Tagc, si la fecha puede cambiar mientras se ejecuta este código, entonces necesita mover today = datetime.today()
dentro del ciclo for
.
Aquí es esencialmente lo mismo, sin una función:
from datetime import datetime
dates = [
[''2017'', ''01'', ''15''],
[''2017'', ''01'', ''14''],
[''2017'', ''01'', ''13''],
]
today = datetime.today()
for d in dates:
delta = (today - datetime(*map(int, d))).days
print(delta)
Estoy usando Python 3.6 y tengo algunos problemas para calcular la fecha.
Tengo una lista compuesta de elementos de fecha como a continuación:
dates = [[''2017'',''01'',''15''], [''2017'',''01'',''14''], [''2017'',''01'',''13''],...]
Me gustaría hacerlo a formato de tiempo y calcular los días a partir de hoy.
¿Cómo puedo arreglar mi código?
A continuación está mi código:
dates = [[''2017'', ''01'', ''15''], [''2017'', ''01'', ''14''], [''2017'', ''01'', ''13'']]
for date in dates:
date_cand = "-".join(date)
date_cand_time = time.strptime(date_cand,"%Y-%m-%d")
(datetime.date.today() - datetime.date(date_cand_time)).days
Tengo este mensaje de error ahora:
TypeError: an integer is required (got type time.struct_time)
El resultado que me gustaría tener es:
4
5
6
Por favor, ayúdame a resolver esto.
Este código parece funcionar. Tenga en cuenta que uso datetime.strptime
lugar de time.strptime
, en caso de que haya alguna diferencia:
from datetime import datetime
def parse_dates(dates_array):
today = datetime.today()
for date_array in dates_array:
date = datetime.strptime(''-''.join(date_array), ''%Y-%m-%d'')
yield (today - date).days
if __name__ == ''__main__'':
dates = [[''2017'', ''01'', ''15''], [''2017'', ''01'', ''14''], [''2017'', ''01'', ''13'']]
for days_from_today in parse_dates(dates):
print(days_from_today)
Salida
4
5
6
Advertencia
Muevo el cálculo de today
fuera del bucle for para obtener beneficios de rendimiento menores, pero esto hará que el código se rompa si deja este código ejecutándose pasada la medianoche. :)
date_cand_time
no es un entero, es una tupla con enteros. No puede pasar eso al objeto datetime.date()
. En su lugar, tendría que pasar los primeros 3 elementos como argumentos separados:
(datetime.date.today() - datetime.date(*date_cand_time[:3])).days
*
Le dice a Python que aplique los valores de la lst_reg_date_cand_time[:3]
como argumentos separados.
Sin embargo, no tomaría un desvío a través de time.strptime()
; simplemente asigne las 3 cadenas a los enteros y páselos directamente:
date_cand = datetime.date(*map(int, date))
(datetime.date.today() - date_cand).days
Los argumentos para datetime.date()
son, después de todo, year
, month
y day
, en el mismo orden en que tiene sus cadenas.
Si debe usar strptime
, utilice datetime.datetime.strptime()
y extraiga el objeto de date
de eso:
date_cand = datetime.datetime.strptime("-".join(date), "%Y-%m-%d")
(datetime.date.today() - date_cand.date()).days
Manifestación:
>>> import datetime
>>> dates = [[''2017'',''01'',''15''], [''2017'',''01'',''14''], [''2017'',''01'',''13'']]
>>> for date in dates:
... # using map, produces a date
... date_cand = datetime.date(*map(int, date))
... print(date_cand, (datetime.date.today() - date_cand).days)
... # using datetime.datetime.strptime, produces a datetime
... date_cand = datetime.datetime.strptime("-".join(date), "%Y-%m-%d")
... print(date_cand, (datetime.date.today() - date_cand.date()).days)
...
2017-01-15 4
2017-01-15 00:00:00 4
2017-01-14 5
2017-01-14 00:00:00 5
2017-01-13 6
2017-01-13 00:00:00 6
Como datetime.date estaba usando en su código para el cálculo delta, aquí hay una forma clara de hacer lo que quiere.
import datetime
dates = [[''2017'', ''01'', ''15''], [''2017'', ''01'', ''14''], [''2017'', ''01'', ''13'']]
today = datetime.date.today()
for date in dates:
year,month,day = [int(s) for s in date] #convert to int and assign to vars : year, month, day
date_cand_time = datetime.date(year,month,day) #convert date to datetime.date
delta = (today - date_cand_time).days #calculate the day delta
print delta
Salida
4
5
6