HOWTO · Pandas

如何从 Pandas 的日期时间列中提取月份和年份

使用 .dt 访问器从 Pandas 日期时间列中提取数值的年份和月份,或使用 strftime() 将它们格式化为字符串。

本页内容

使用 Series 的日期时间访问器添加单独的年份和月份列:dates.dt.year 和 dates.dt.month。这些属性返回数值组件。如果源列包含日期字符串,请先用 pandas.to_datetime 转换一次,然后再使用 .dt。当结果应该是文本时(例如格式化为 01 的月份),请选择 strftime()。

使用 Series.dt.year 和 Series.dt.month 提取月份和年份

.dt 访问器可以访问 Pandas Series 上的日期时间属性。其中,pandas.Series.dt.year 和 pandas.Series.dt.month 以数值形式返回年份和月份;它们是属性,所以不要给它们加括号。Series year 参考对 year 属性进行了说明。

当输入列的值是字符串时,请使用 pandas.to_datetime 转换该列。下面的示例从 ISO 日期字符串开始,转换该列,并赋值提取出的两个组件。该示例转换日期字符串,赋值数值形式的年份和月份,然后打印生成的 DataFrame。

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

如果某列已经是日期时间类型,请跳过转换行,直接应用这两个属性。解析是否成功取决于值是否以 Pandas 可以解释的格式表示日期;格式不同的源字符串应先规范化或显式解析,再提取组件。月份属性是数值型的,所以一月表示为 1,这对排序或数值比较很有用。

使用 strftime() 格式化年份和月份

当后续代码需要格式化字符串而不是数值组件时,请使用 strftime()。使用 Series 的 .dt 访问器时,%Y 格式化四位数的年份,%m 格式化两位数的月份。对于日期 2020-01-02,这两种格式分别对应字符串 2020 和 01。

此版本使用相同的输入转换,并添加文本列。月份字符串保持零填充,这对标签或年月键很有用。由于这些值是字符串,如果后续需要计算或数值排序,请将它们转换为数字。

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

当您需要用于算术运算或数值比较的值时,请使用数值型的 .dt.year 和 .dt.month 属性。当展示格式很重要,或者需要像 01 这样固定宽度的月份时,请使用 strftime()。这两种方法都作用于已具有日期时间类型的值。

使用 DatetimeIndex.year 和 DatetimeIndex.month 提取月份和年份

您也可以将日期时间 Series 包装到 pandas.DatetimeIndex 中,然后读取其 year 和 month 属性。DatetimeIndex 参考对这种索引类型进行了说明。这些属性与 Series 访问器一样给出数值组件,并且可以一步赋值给 DataFrame 列。

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

当索引对象适合您其余的工作流时,请使用 DatetimeIndex;对于普通的 Series 列,.dt 属性通常是最直接的表达方式。这两种方法产生数值形式的年份和月份值,而 strftime() 产生字符串。在每种情况下,都要先确保源是日期时间类型。这些例子使用仅含日期的字符串;当时间戳包含时区时,请记住预期的时区,因为日历年和月取决于时间戳的本地日期。