representación punto programacion numero numericos normalizado normalizada metodos mantisa informatica flotante ejemplos r date

programacion - Obtener diferencia de fecha en años(punto flotante)



punto flotante normalizado (5)

Quiero corregir la actividad de la fuente en función de la diferencia entre la fecha de referencia y la medida y la vida media de la fuente (medida en años). Di que tengo

ref_date <- as.Date(''06/01/08'',format=''%d/%m/%y'')

y una columna en mi data.frame con el mismo formato de fecha, por ejemplo,

today <- as.Date(Sys.Date(), format=''%d/%m/%y'')

Puedo encontrar el número de años entre estas fechas usando el paquete lubridate

year(today)-year(ref_date) [1] 5

¿Existe una función que pueda usar para obtener una respuesta de punto flotante today - ref_date = 5.2y, por ejemplo?


Como ya está utilizando el paquete lubridate, puede obtener varios años en coma flotante con un simple truco:

Encuentra el número de segundos en un año:

seconds_in_a_year <- as.integer((seconds(ymd("2010-01-01")) - seconds(ymd("2009-01-01"))))

Ahora obtenga la cantidad de segundos entre las 2 fechas que desea

seconds_between_dates <- as.integer(seconds(date1) - seconds(date2))

Su respuesta final para el número de años en puntos flotantes será

years_between_dates <- seconds_between_dates / seconds_in_a_year


El paquete lubridate contiene una función incorporada , time_length , que puede ayudar a realizar esta tarea.

time_length(difftime(as.Date("2003-04-05"), as.Date("2001-01-01")), "years") [1] 2.257534 time_length(difftime(as.Date("2017-03-01"), as.Date("2012-03-01")),"years") [1] 5.00274

La documentación para el paquete lubridate se puede encontrar here .


Inspirado por , time_length() funcionaría mejor si se utiliza un objeto de intervalo

time_length(interval(as.Date("2003-04-05"), as.Date("2001-01-01")), "years") [1] -2.257534 time_length(difftime(as.Date("2017-03-01"), as.Date("2012-03-01")),"years") [1] 5.00274 time_length(interval(as.Date("2017-03-01"), as.Date("2012-03-01")),"years") [1] -5

Puede ver si usa el interval() para obtener la diferencia de tiempo y luego pasarla a time_length() , time_length() tomaría en cuenta el hecho de que no todos los meses y años tienen la misma cantidad de días, por ejemplo, el año bisiesto .


No es una respuesta exacta a su pregunta, pero la respuesta de en algunas situaciones puede producir pequeños errores.

Por favor, considere el siguiente ejemplo:

as.numeric(difftime(as.Date("2012-03-01"), as.Date("2017-03-01"), unit="weeks"))/52.25 [1] -4.992481

La respuesta correcta aquí debe ser por lo menos 5 años.

La siguiente función (utilizando el paquete lubridate ) calculará una cantidad de años completos entre dos fechas:

# Function to calculate an exact full number of years between two dates year.diff <- function(firstDate, secondDate) { yearsdiff <- year(secondDate) - year(firstDate) monthsdiff <- month(secondDate) - month(firstDate) daysdiff <- day(secondDate) - day(firstDate) if ((monthsdiff < 0) | (monthsdiff == 0 & daysdiff < 0)) { yearsdiff <- yearsdiff - 1 } yearsdiff }

Puede modificarlo para calcular una parte fraccionaria dependiendo de cómo defina el número de días en el último año (no terminado).


Sí, por supuesto, use difftime() con un numérico:

R> as.numeric(difftime(as.Date("2003-04-05"), as.Date("2001-01-01"), + unit="weeks"))/52.25 [1] 2.2529 R>

Tenga en cuenta que tenemos que cambiar a semanas con una escala de 52,25, ya que hay un poco de ambigüedad en términos de conteo de años: un 29 de febrero se produce cada 4 años, pero no cada 100, etc.

Así que tienes que definir eso. difftime() maneja todas las unidades de tiempo hasta semanas. Los meses no se pueden hacer por la misma razón del ''numerador'' no constante.