estadistica.ar · Enciclopedia de Estadística en españolhttps://estadistica.ar/conceptos/fechas-y-duraciones
Fechas, horas y duraciones
Cómo leer, validar y restar fechas sin errores silenciosos: códigos que parecen fechas, día/mes contra mes/día, edad cumplida, fechas de Excel, zonas horarias y la diferencia entre período y duración.
Por Jorge Luis Montivero, Licenciado en Estadística · Mu3Sigma
1 · Una fecha no es un número ni un texto
Una fecha parece un dato simple, pero junta tres convenciones: un calendario con meses de largo distinto y años bisiestos, un formato de escritura que cambia de un país a otro y, si tiene hora, una zona horaria. Cada programa guarda internamente otra cosa: R cuenta días desde el 1 de enero de 1970, Excel cuenta días desde 1900, y un CSV guarda texto.
Por eso los errores con fechas casi nunca dan un mensaje de error. Dan un
número que parece razonable y no lo es. Esta entrada recorre los más comunes
con un caso real: la fecha de nacimiento de las 43.739 personas de la
EPH del primer trimestre de 2026 (variable CH05), que la base
trae junto con la edad (CH06) y permite controlar una con la otra.
2 · Los códigos que parecen fechas
Lo primero que hay que hacer con una columna de fechas es contar sus valores más frecuentes. En la EPH:
Valor de CH05 | Personas | Qué es |
|---|---|---|
| 01/01/1900 | 9.607 | Fecha no relevada (22 % de la base) |
| 09/09/9999 | 108 | No sabe o no responde |
| 07/10/7198 y 07/05/5198 | 2 | Errores de tipeo en el año |
| Resto | 34.022 | Fechas de nacimiento válidas |
Los dos primeros son códigos, no fechas: el diccionario de la EPH los define como valores especiales. Pero tienen forma de fecha y cualquier programa los lee como tales:
- Con el 01/01/1900, cada persona sin fecha relevada pasa a tener 126 años. La edad media de la base salta de 37,6 a 57,0 años. No hay error ni aviso: el resultado es un número plausible para una población envejecida. Entre esas 9.607 personas hay 59 bebés de menos de un año.
- Con el 09/09/9999, R lo acepta como fecha válida y la edad da −7.974 años. En pandas, en cambio, queda vacío, porque el tipo de fecha de pandas no llega más allá del año 2262. El mismo dato produce resultados distintos según el programa.
3 · Día/mes o mes/día
En la Argentina las fechas se escriben día/mes/año; en los Estados Unidos, mes/día/año. Un programa configurado en inglés que lee «05/08/2016» entiende 8 de mayo, no 5 de agosto, y no tiene forma de saber que se equivoca.
Si las 34.022 fechas válidas de la EPH se leyeran como mes/día:
- El 59,4 % fallaría, porque el día es mayor que 12 y no existe un mes 13 o posterior. Ese error al menos se ve.
- El 36,5 % se leería sin ningún error pero con el día y el mes intercambiados. Son las fechas con día entre 1 y 12, distinto del mes.
- El 4,1 % quedaría igual, porque el día coincide con el mes.
Entre las que se leen al revés sin error, el 27,5 % termina con una edad
distinta. La regla práctica es declarar siempre el formato al leer:
format = "%d/%m/%Y" en R, format="%d/%m/%Y" o dayfirst=True en pandas.
Si una lectura sin formato «funciona», puede ser solo porque las fechas
ambiguas pasaron sin error.
Para escribir fechas en un archivo, el formato que no se confunde es el ISO 8601: año-mes-día, como 2026-02-15. Se ordena bien alfabéticamente y ningún programa lo interpreta de dos maneras.
4 · La edad cumplida
La edad que se usa en estadística es la edad cumplida: los años enteros desde el nacimiento hasta la fecha de referencia. Se calcula con el calendario, no con días:
Los atajos con días fallan. Dividir los días vividos por 365 ignora los años bisiestos: cada cuatro años suma un día de más, y cerca del cumpleaños la edad salta antes de tiempo. Dividir por 365,25 lo compensa en promedio, pero no exactamente.
Con la fecha de referencia del 15 de febrero de 2026, sobre las 34.021 personas nacidas antes de ese día:
- Días / 365 asigna una edad equivocada al 2,6 %: 881 personas.
- Días / 365,25 se equivoca con 30 personas, el 0,09 %.
- La cuenta de cumpleaños no se equivoca nunca.
lubridateen R, coninterval(nacimiento, ref) %/% years(1), da lo mismo en las 34.021.
La fecha de referencia importa
La EPH no publica el día de la entrevista: solo el trimestre. Con la fecha de nacimiento se puede calcular la edad al 1 de enero y al 31 de marzo de 2026, y la edad declarada tiene que estar entre las dos. Pasa en el 99,25 % de los casos. Hay 255 personas fuera de ese rango, 23 de ellas por más de un año: son errores de la fecha o de la edad, y el control los encuentra.
El 24,9 % de las personas cumple años durante el trimestre, así que su edad depende de qué día se hizo la entrevista. Cuando una base trae la fecha de nacimiento pero no la de referencia, la edad no queda determinada, y hay que decir qué fecha se usó.
El 29 de febrero
En la EPH hay 13 personas nacidas un 29 de febrero. En los años no bisiestos,
¿cumplen el 28 de febrero o el 1 de marzo? No hay una respuesta universal, y
los programas no coinciden: para lubridate, alguien nacido el 29/02/2000
cumple 26 años el 28/02/2026; con la cuenta de la fórmula de arriba, recién el
1 de marzo. Las dos edades difieren un solo día por año y solo para esas
personas, así que en la EPH no cambian nada, pero en un registro de
nacimientos o en un cálculo de vencimientos conviene decidirlo y dejarlo
escrito.
5 · Las fechas de Excel
Excel guarda cada fecha como un número de serie: los días contados desde el 1 de enero de 1900, que es el 1. El 15 de febrero de 2026 es el 46.068. Si al exportar se pierde el formato, en el CSV aparece el número y no la fecha.
Para convertir el número de vuelta a fecha, el origen no es el 1 de enero de 1900 sino el 30 de diciembre de 1899:
as.Date(46068, origin = "1899-12-30") # "2026-02-15"
pd.to_datetime(46068, unit="D", origin="1899-12-30") # 2026-02-15
La diferencia de dos días tiene dos causas. Excel numera desde 1, no desde 0, y además trata a 1900 como bisiesto, que no lo fue: el número 60 es un 29 de febrero de 1900 que nunca existió. Lo hereda de Lotus 1-2-3, por compatibilidad. Por eso las fechas anteriores al 1 de marzo de 1900 quedan corridas un día, aunque casi nunca importa.
6 · Períodos y duraciones
«Un mes después» y «30 días después» no son lo mismo. Hay dos maneras de medir un intervalo:
- Un período es una cantidad en unidades del calendario: un mes, un año. Su largo en días depende de dónde empieza: un año que contiene un 29 de febrero tiene 366 días.
- Una duración es una cantidad exacta de tiempo: días, horas, segundos.
Un año de duración es siempre igual, y en
lubridatevale 365,25 días.
La edad, la antigüedad laboral o el plazo de un préstamo son períodos. El tiempo de supervivencia en un estudio clínico o la demora entre dos eventos suelen medirse como duraciones, en días, para que todas las unidades midan lo mismo (ver análisis de supervivencia).
Los períodos tienen casos raros. Sumarle un mes al 31 de enero da un 31 de febrero que no existe, y cada programa resuelve distinto:
R ymd("2026-01-31") + months(1) NA: la fecha no existe
R ymd("2026-01-31") %m+% months(1) 2026-02-28
pandas pd.Timestamp("2026-01-31") + pd.DateOffset(months=1) 2026-02-28
Excel =FECHA.MES("31/01/2026"; 1) 28/02/2026
%m+% y pandas retroceden al último día del mes; el + de lubridate
prefiere devolver un faltante antes que inventar una fecha.
7 · Horas y zonas horarias
Una fecha con hora sin zona horaria es ambigua. La Argentina usa la hora UTC−3 todo el año: desde 2009 no hay horario de verano. Muchos sistemas, en cambio, guardan las marcas de tiempo en UTC, la hora universal.
La consecuencia típica: un registro hecho en la Argentina el 31 de diciembre a
las 22:00 queda guardado como el 1 de enero a la 01:00 UTC. Si se agrupa por
día, mes o año sin convertir, todo lo que pasó después de las 21:00 cae en el
día siguiente, y en el año siguiente si es 31 de diciembre. Al leer, hay que
declarar la zona: with_tz(x, "America/Argentina/Catamarca") en R,
.dt.tz_convert("America/Argentina/Catamarca") en pandas.
En otros países el horario de verano agrega un problema más: un día con 23 horas y otro con 25, y una hora que existe dos veces. Una serie horaria con esos saltos tiene un hueco y un dato duplicado por año.
8 · Fecha de qué
Antes de las cuestiones técnicas hay una de contenido: a qué hecho corresponde la fecha. En las estadísticas vitales, un nacimiento tiene fecha de ocurrencia y fecha de inscripción, y pueden ser de años distintos; una tabla «por año» puede usar cualquiera de las dos. En los registros administrativos pasa lo mismo con la fecha del trámite, la de carga y la de aprobación.
El nombre de la variable no alcanza para saberlo, porque a veces sugiere lo contrario de lo que contiene. Lo dice el diccionario de la base, y si no lo dice, hay que preguntarle al productor del dato.
9 · Errores frecuentes
- No contar los valores más frecuentes antes de usar una fecha. El 01/01/1900 de la EPH es el valor más repetido de la columna, por lejos, y se ve en la primera tabla de frecuencias.
- Leer fechas sin declarar el formato. Un tercio de las fechas se lee al revés sin ningún aviso.
- Calcular la edad con días/365. Equivoca la edad de una de cada 40 personas, y de una de cada 16 entre los mayores de 80.
- Guardar fechas como texto en formato local. Para ordenar, cruzar y compartir, el formato es ISO 8601.
- Convertir números de Excel con el origen equivocado. El origen correcto es el 30/12/1899 (o el 01/01/1904 para planillas del sistema de Mac).
- Agrupar marcas de tiempo en UTC por día local. Lo de la noche cae en el día siguiente.
- Usar la fecha que no corresponde. Ocurrencia, registro y carga son fechas distintas.
10 · Software
En R, lubridate cubre casi todo:
library(lubridate)
nac <- dmy(eph$CH05) # día/mes/año, explícito
nac[eph$CH05 %in% c("01/01/1900", "09/09/9999")] <- NA # los códigos, a faltante
edad <- interval(nac, ymd("2026-02-15")) %/% years(1) # edad cumplida
En Python, con pandas:
nac = pd.to_datetime(eph["CH05"], format="%d/%m/%Y", errors="coerce")
nac = nac.mask(eph["CH05"].isin(["01/01/1900", "09/09/9999"]))
ref = pd.Timestamp("2026-02-15")
edad = ref.year - nac.dt.year - ((nac.dt.month > ref.month) |
((nac.dt.month == ref.month) & (nac.dt.day > ref.day)))
En Excel, la edad cumplida es =SIFECHA(nacimiento; referencia; "Y"), una
función que no aparece en el asistente pero existe.
Las cuentas de esta entrada están en datos/computo/preparar-fechas-m16.py, y
datos/computo/fechas-m16.R las repite en R: coinciden todas.
Seguir leyendo
Bioestadística · Cómputo y comunicación · 284 de 330
Estadística para Economía y Administración · Cómputo y comunicación · 289 de 318
Probabilidad y Estadística · Cómputo y comunicación · 277 de 302
Estadística para Ciencias Sociales · Cómputo y comunicación · 248 de 288
Estadística para la tesis · Los datos · 69 de 233
Cómo citar: Montivero, J. L. (2026). Fechas, horas y duraciones. estadistica.ar. https://estadistica.ar/conceptos/fechas-y-duraciones
estadistica.ar es gratuita y sin publicidad. Si te sirvió, podés invitar un cafecito por transferencia al alias mu3sigma. Asesoramiento estadístico, encuestas y capacitaciones: m3s.pro · WhatsApp +54 9 383 499-7929.
Cómo citar esta entrada
APA (7.ª edición)
Montivero, J. L. (2026). Fechas, horas y duraciones. estadistica.ar. https://estadistica.ar/conceptos/fechas-y-duraciones
BibTeX
@misc{estadistica_ar_fechas_y_duraciones,
author = {Montivero, Jorge Luis},
title = {{Fechas, horas y duraciones}},
year = {2026},
howpublished = {\url{https://estadistica.ar/conceptos/fechas-y-duraciones}},
note = {estadistica.ar. Consultado el \today},
urldate = {2026-10-31}
}Última actualización: 31 de octubre de 2026. El contenido está bajo licencia CC BY-NC-SA 4.0: se puede reutilizar citando la fuente y sin fines comerciales.