HOWTO · Pandas

Cómo extraer mes y año por separado de la columna Fecha y hora en Pandas

Extraiga valores numéricos de año y mes de una columna datetime de Pandas con el accesor .dt, o formatéelos como cadenas con strftime().

En esta página

Usa un accesor de fecha y hora de una Series para añadir columnas separadas de año y mes: dates.dt.year y dates.dt.month. Estas propiedades devuelven componentes numéricos. Si la columna de origen contiene cadenas de fecha, conviértelas una sola vez con pandas.to_datetime antes de usar .dt. Elige strftime() si necesitas que el resultado sea texto, por ejemplo, un mes con formato 01.

Extraer el mes y el año con Series.dt.year y Series.dt.month

El accesor .dt permite acceder a las propiedades de fecha y hora de una Series de Pandas. En concreto, pandas.Series.dt.year y pandas.Series.dt.month devuelven el año y el mes como valores numéricos; son propiedades, así que no les añadas paréntesis. La referencia de year para Series documenta la propiedad del año.

Convierte la columna de entrada con pandas.to_datetime si sus valores son cadenas. El ejemplo siguiente parte de cadenas de fecha ISO, convierte la columna y asigna los dos componentes extraídos. Después imprime el DataFrame resultante con los valores numéricos del año y del mes.

import pandas as pd

df = pd.DataFrame({"joined": ["2019-11-20", "2020-01-02", "2020-02-05"]})
df["joined"] = pd.to_datetime(df["joined"])
df["year"] = df["joined"].dt.year
df["month"] = df["joined"].dt.month
print(df)
      joined  year  month
0 2019-11-20  2019     11
1 2020-01-02  2020      1
2 2020-02-05  2020      2

Si una columna ya tiene un tipo de dato de fecha y hora, omite la línea de conversión y aplica directamente las dos propiedades. El análisis depende de que los valores representen fechas en un formato que Pandas pueda interpretar; normaliza las cadenas de origen o analízalas explícitamente si tienen otro formato antes de extraer sus componentes. La propiedad del mes devuelve un valor numérico: enero se representa como 1, lo que resulta útil para ordenar o hacer comparaciones numéricas.

Dar formato al año y al mes con strftime()

Usa strftime() cuando el código posterior necesite cadenas con formato en lugar de componentes numéricos. Con el accesor .dt de Series, %Y da formato al año con cuatro dígitos y %m al mes con dos. Para la fecha 2020-01-02, esos formatos corresponden a las cadenas 2020 y 01.

Esta versión usa la misma conversión de entrada y añade columnas de texto. La cadena del mes conserva el cero inicial, algo útil para etiquetas o claves de año y mes. Como estos valores son cadenas, conviértelos a números si después necesitas hacer cálculos u ordenarlos numéricamente.

import pandas as pd

df = pd.DataFrame({"joined": ["2019-11-20", "2020-01-02", "2020-02-05"]})
df["joined"] = pd.to_datetime(df["joined"])
df["year"] = df["joined"].dt.strftime("%Y")
df["month"] = df["joined"].dt.strftime("%m")
print(df)
      joined  year month
0 2019-11-20  2019    11
1 2020-01-02  2020    01
2 2020-02-05  2020    02

Usa las propiedades numéricas .dt.year y .dt.month cuando necesites valores para realizar operaciones aritméticas o comparaciones numéricas. Usa strftime() si importa el formato de presentación o necesitas un mes de ancho fijo, como 01. Ambos métodos requieren valores con tipo de dato de fecha y hora.

Extraer el mes y el año con DatetimeIndex.year y DatetimeIndex.month

También puedes convertir una Series de fechas en pandas.DatetimeIndex y consultar sus atributos year y month. La referencia de DatetimeIndex describe este tipo de índice. Estos atributos proporcionan componentes numéricos, igual que el accesor de Series, y permiten asignarlos a columnas del DataFrame en un solo paso.

import pandas as pd

df = pd.DataFrame({"joined": ["2019-11-20", "2020-01-02", "2020-02-05"]})
df["joined"] = pd.to_datetime(df["joined"])
dates = pd.DatetimeIndex(df["joined"])
df["year"] = dates.year
df["month"] = dates.month
print(df)
      joined  year  month
0 2019-11-20  2019     11
1 2020-01-02  2020      1
2 2020-02-05  2020      2

Usa DatetimeIndex cuando un objeto de índice encaje con el resto de tu flujo de trabajo; para una columna Series normal, las propiedades .dt suelen ser la opción más directa. Los dos métodos devuelven valores numéricos para el año y el mes, mientras que strftime() devuelve cadenas. En todos los casos, asegúrate primero de que el origen tenga tipo de dato de fecha y hora. Estos ejemplos usan cadenas que solo contienen fechas; si las marcas de tiempo incluyen zonas horarias, ten en cuenta cuál es la zona horaria deseada, porque el año y el mes del calendario dependen de la fecha local de la marca de tiempo.