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.