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.