【Pandas】マルチインデックスから複数列を指定する
MAX
MAX999blog
pandasで日付を扱う時には、曜日が必要になることが割と多い。
また、曜日以外にも日付を分解する機会も多い。
曜日の取得にはいくつか方法があるので紹介する。
Pandasでは列を日付として扱うためにdatetime64型に変換する必要がある。
1df = pd.DataFrame(data=[["2020-1-1", "2021-1-1"],
2 ["2020-1-2", "2021-2-1"],
3 ["2020-1-3", "2021-3-1"]],
4 columns=["colA", "colB"])
5df["colA"] = pd.to_datetime(df["colA"], format="%Y-%m-%d")
6print(df.dtypes)
7
8# colA datetime64[ns]
9# colB object
10# dtype: object
to_datetimeで型を変換する。
曜日は「Monday」「Mon」などの文字列として取得する方法と、「0」「1」などの数値として取得する方法がある。
文字列、数値共に複数の方法がある。
「Monday」「Tuesday」として取得する方法。
1df["colA"].dt.day_name()
2
3# 0 Monday
4# 1 Tuesday
5# 2 Wednesday
6# 3 Thursday
7# 4 Friday
8# 5 Saturday
9# 6 Sunday
10# Name: colA, dtype: object
同じく「Monday」「Tuesday」として取得する方法。
1df["colA"].dt.strftime("%A")
2
3# 0 Monday
4# 1 Tuesday
5# 2 Wednesday
6# 3 Thursday
7# 4 Friday
8# 5 Saturday
9# 6 Sunday
10# Name: colA, dtype: object
「Mon」「Tue」などで取得する方法。
文字として見たい場合は、この方法の方が短くなるので見やすいかもしれない。
1df["colA"].dt.strftime("%a")
2
3# 0 Mon
4# 1 Tue
5# 2 Wed
6# 3 Thu
7# 4 Fri
8# 5 Sat
9# 6 Sun
10# Name: colA, dtype: object
数値で取得する場合、月曜日が0、日曜日が6となる。
計算に扱いやすいのはこの方法になる。
1df["colA"].dt.weekday
2
3# 0 0
4# 1 1
5# 2 2
6# 3 3
7# 4 4
8# 5 5
9# 6 6
10# Name: colA, dtype: int64
同じく数値で取得する方法。
1df["colA"].dt.dayofweek
2
3# 0 0
4# 1 1
5# 2 2
6# 3 3
7# 4 4
8# 5 5
9# 6 6
10# Name: colA, dtype: int64
日付データから「年」の部分を取得する方法。
1df["colA"].dt.year
2
3# 0 2020
4# 1 2020
5# 2 2020
6# 3 2020
7# 4 2020
8# 5 2020
9# 6 2020
10# Name: colA, dtype: int64
strftimeを使うと文字列として年を取得することができる。
(あまり使う機会がないかもしれないが)
1df["colA"].dt.strftime("%Y")
2
3# 0 2020
4# 1 2020
5# 2 2020
6# 3 2020
7# 4 2020
8# 5 2020
9# 6 2020
10# Name: colA, dtype: object
下2桁を取得したい場合
1df["colA"].dt.strftime("%y")
2
3# 0 20
4# 1 20
5# 2 20
6# 3 20
7# 4 20
8# 5 20
9# 6 20
10# Name: colA, dtype: object
月も年と同じ方法ようなで取得できる。
1df["colA"].dt.month
2
3# 0 1
4# 1 1
5# 2 1
6# 3 1
7# 4 1
8# 5 1
9# 6 1
10# Name: colA, dtype: int64
先頭に「0」が欲しい場合に使用するかもしれない。
1df["colA"].dt.strftime("%m")
2
3# 0 01
4# 1 01
5# 2 01
6# 3 01
7# 4 01
8# 5 01
9# 6 01
10# Name: colA, dtype: object
日付も月と同じ方法で取得できる。
1df["colA"].dt.day
2
3# 0 6
4# 1 7
5# 2 8
6# 3 9
7# 4 10
8# 5 11
9# 6 12
10# Name: colA, dtype: int64
先頭に「0」が欲しい場合に使用するかもしれない。
1df["colA"].dt.strftime("%d")
2
3# 0 06
4# 1 07
5# 2 08
6# 3 09
7# 4 10
8# 5 11
9# 6 12
10# Name: colA, dtype: object
数値 | 文字列 | |
曜日 | weekday, dayofweek | day_name(), strftime(“%A”), strftime(“%a”) |
年 | year | strftime(“%Y”), strftime(“%y”) |
月 | month | strftime(“%m”) |
日 | day | strftime(“%d”) |
df[“colA”].dtに対して上記の表の通りに曜日や年月日を取得できる。