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() 產生字串。在每種情況下,都要先確保來源是日期時間類型。這些例子使用僅含日期的字串;當時間戳包含時區時,請記住預期的時區,因為曆年和月取決於時間戳的本地日期。