Cambiar datos a fechas
Cambiar datos a fechas#
Otra transformación común en los conjuntos de datos es aquella relacionada con los datos temporales. Vimos en la sección dedicada a los tipos de datos las diferencias entre los tipos temporales datetime
y timedelta
. Incluso realizamos un ejercicio de transformar dos columnas al tipo datetime
y hacer un cálculo con ellas.
En ese caso, utilizamos la siguiente sintaxis:
df['columna'] = pd.to_datetime(df['columna'])
Como en otras formas de transformación de datos, le solicitamos a pandas
que transforme la ‘Serie’ o columna columna
a un tipo datetime
.
Para nuestro conjunto de datos muestra_covid
requeriremos asegurarnos que tengamos datos de tipo datetime
para las siguientes columnas
fecha_ingreso object
fecha_sintomas object
fecha_def object
Debido a que sabemos exactamente qué columnas queremos modificar, podemos pasarlas como una lista y luego transformarlas a datetime
.
columnas = ['fecha_ingreso', 'fecha_sintomas', 'fecha_def']
for columna in columnas:
muestra_covid[columna] = pd.to_datetime(muestra_covid.loc[:, columna])
muestra_covid.dtypes
Unnamed: 0 int64
sexo object
edad int64
entidad_nacimiento object
municipio_residencia object
indigena object
nacionalidad object
migrante object
pais_nacionalidad object
fecha_ingreso datetime64[ns]
fecha_sintomas datetime64[ns]
fecha_def datetime64[ns]
dtype: object
SettingWithCopyWarning
Esta advertencia se debe a que estamos intentando modificar una columna que es una copia del original. Como pandas
no puede saber si esto era lo que realmente queríamos hacer, nos envía esa advertencia. Por lo pronto podemos pasarla por alto, pero si deseas profundizar en ello, podrías revisar la documentación de pandas
.
Funcionó perfectamente, ¿no es así? Esto es porque el formato de fecha original tiene un formato identificable (‘AAAA-MM-DD’), incluso si no tiene un formato tan explícito (por ejemplo ‘AAAAMMDD’), pandas
lo podría reconocer.
Sin embargo, no todos los campos que pudieran ser de fecha pueden ser convertidos de manera automática. Por ejemplo, si tuviésemos un conjunto de datos como el siguiente:
fecha = pd.DataFrame({'fecha': ['12 de enero de 2022', '15 de febrero de 2022']})
fecha
fecha | |
---|---|
0 | 12 de enero de 2022 |
1 | 15 de febrero de 2022 |
Al intentar transformarlo nos daría un error.
fecha['fecha'] = pd.to_datetime(fecha['fecha'])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
~/opt/anaconda3/lib/python3.9/site-packages/pandas/core/arrays/datetimes.py in objects_to_datetime64ns(data, dayfirst, yearfirst, utc, errors, require_iso8601, allow_object, allow_mixed)
2186 try:
-> 2187 values, tz_parsed = conversion.datetime_to_datetime64(data.ravel("K"))
2188 # If tzaware, these values represent unix timestamps, so we
~/opt/anaconda3/lib/python3.9/site-packages/pandas/_libs/tslibs/conversion.pyx in pandas._libs.tslibs.conversion.datetime_to_datetime64()
TypeError: Unrecognized value type: <class 'str'>
During handling of the above exception, another exception occurred:
ParserError Traceback (most recent call last)
/var/folders/6z/cjmzygfj49d6yzn_qgny7hgr0000gp/T/ipykernel_99206/1962731354.py in <module>
----> 1 fecha['fecha'] = pd.to_datetime(fecha['fecha'])
~/opt/anaconda3/lib/python3.9/site-packages/pandas/core/tools/datetimes.py in to_datetime(arg, errors, dayfirst, yearfirst, utc, format, exact, unit, infer_datetime_format, origin, cache)
885 result = arg.map(cache_array)
886 else:
--> 887 values = convert_listlike(arg._values, format)
888 result = arg._constructor(values, index=arg.index, name=arg.name)
889 elif isinstance(arg, (ABCDataFrame, abc.MutableMapping)):
~/opt/anaconda3/lib/python3.9/site-packages/pandas/core/tools/datetimes.py in _convert_listlike_datetimes(arg, format, name, tz, unit, errors, infer_datetime_format, dayfirst, yearfirst, exact)
399 assert format is None or infer_datetime_format
400 utc = tz == "utc"
--> 401 result, tz_parsed = objects_to_datetime64ns(
402 arg,
403 dayfirst=dayfirst,
~/opt/anaconda3/lib/python3.9/site-packages/pandas/core/arrays/datetimes.py in objects_to_datetime64ns(data, dayfirst, yearfirst, utc, errors, require_iso8601, allow_object, allow_mixed)
2191 return values.view("i8"), tz_parsed
2192 except (ValueError, TypeError):
-> 2193 raise err
2194
2195 if tz_parsed is not None:
~/opt/anaconda3/lib/python3.9/site-packages/pandas/core/arrays/datetimes.py in objects_to_datetime64ns(data, dayfirst, yearfirst, utc, errors, require_iso8601, allow_object, allow_mixed)
2173 order: Literal["F", "C"] = "F" if flags.f_contiguous else "C"
2174 try:
-> 2175 result, tz_parsed = tslib.array_to_datetime(
2176 data.ravel("K"),
2177 errors=errors,
~/opt/anaconda3/lib/python3.9/site-packages/pandas/_libs/tslib.pyx in pandas._libs.tslib.array_to_datetime()
~/opt/anaconda3/lib/python3.9/site-packages/pandas/_libs/tslib.pyx in pandas._libs.tslib.array_to_datetime()
~/opt/anaconda3/lib/python3.9/site-packages/pandas/_libs/tslib.pyx in pandas._libs.tslib._array_to_datetime_object()
~/opt/anaconda3/lib/python3.9/site-packages/pandas/_libs/tslib.pyx in pandas._libs.tslib._array_to_datetime_object()
~/opt/anaconda3/lib/python3.9/site-packages/pandas/_libs/tslibs/parsing.pyx in pandas._libs.tslibs.parsing.parse_datetime_string()
~/opt/anaconda3/lib/python3.9/site-packages/dateutil/parser/_parser.py in parse(timestr, parserinfo, **kwargs)
1366 return parser(parserinfo).parse(timestr, **kwargs)
1367 else:
-> 1368 return DEFAULTPARSER.parse(timestr, **kwargs)
1369
1370
~/opt/anaconda3/lib/python3.9/site-packages/dateutil/parser/_parser.py in parse(self, timestr, default, ignoretz, tzinfos, **kwargs)
641
642 if res is None:
--> 643 raise ParserError("Unknown string format: %s", timestr)
644
645 if len(res) == 0:
ParserError: Unknown string format: 12 de enero de 2022
Notarás que tenemos un error ParserError
porque pandas
no puede reconocer la fecha a la que nos referimos, en buena medida porque no tiene un soporte de multilengua. En cambio si estuviese escrito en inglés, podría ser convertido.
fecha = pd.DataFrame({'fecha': ['January 12 2022', 'February 26 2022']})
fecha['fecha'] = pd.to_datetime(fecha['fecha'])
fecha
fecha | |
---|---|
0 | 2022-01-12 |
1 | 2022-02-26 |
En este momento, es suficiente con tener en cuenta estas advertencias. Si tu conjunto de datos pudo ser manipulada de manera correcta con los procesos que vimos anteriormente, estás listo para realizar la visualización de datos. Si quieres aprender un poco más o requieres de alguna transformación adicional, puedes pasar a la siguiente sección.