各列を変更する関数を作り、DataFrame.rename に指定してください。
rename する関数の内容
- pd.to_datetime で "@_{年}{月}_データ" を datetime に変換する。
- pd.isna() を調べて、"area" のような "@_{年}{月}_データ" という形式でない列は変更しないでそのまま返す。
- 今日の datetime との差分を計算し、何ヶ月前かを調べる。
- "データ_{nヶ月前}M" という文字列を返す。
python
1
2
3import pandas as pd
4import numpy as np
5
6df = pd.DataFrame(
7 [
8 [2190, 13378, 2190, 13378],
9 [1904, 13378, 2190, 13378],
10 [5157, 13378, 2190, 13378],
11 ],
12 columns=["area", "@_201905_データ", "@_201904_データ", "@_201903_データ"],
13 index=["Tokyooo", "Osaka", "Chibaaa"],
14)
15
16
17def renamer(name):
18 # "@_%Y%m_データ" を datetime に変換する。
19 date = pd.to_datetime(name, format="@_%Y%m_データ", errors="coerce")
20 if pd.isna(date):
21 return name # "@_{年}{月}_データ" という形式でない場合
22
23 # 何ヶ月前かを計算する。
24 months = (pd.to_datetime("today") - date) // np.timedelta64(1, "M")
25
26 return f"データ_{months}M"
27
28
29df.rename(columns=renamer, inplace=True)
30
31print(df)
32# area データ_1M データ_2M データ_3M
33# Tokyooo 2190 13378 2190 13378
34# Osaka 1904 13378 2190 13378
35# Chibaaa 5157 13378 2190 13378
追記
複数パターン存在する場合は、どのようにループさせていけば良いでしょうか..?
pandas.to_datetime() に exact=False を追加してください。
これにより、列名の一部が @_{年}{月}_データ
とマッチすれば、日付に変換できます。
pandas.to_datetime — pandas 0.24.2 documentation
変更箇所
diff
1- date = pd.to_datetime(name, format="@_%Y%m_データ", errors="coerce")
2+ date = pd.to_datetime(name, format="@_%Y%m_データ", errors="coerce", exact=False)
修正後のコード全体
python
1import pandas as pd
2import numpy as np
3
4df = pd.DataFrame(
5 [
6 [2190, 13378, 2190, 13378, 13378, 2190, 13378],
7 [1904, 13378, 2190, 13378, 13378, 2190, 13378],
8 [5157, 13378, 2190, 13378, 13378, 2190, 13378],
9 ],
10 columns=[
11 "area",
12 "@_201905_データA",
13 "@_201904_データA",
14 "@_201905_データB",
15 "@_201904_データB",
16 "@_201905_データC",
17 "@_201904_データC",
18 ],
19 index=["Tokyooo", "Osaka", "Chibaaa"],
20)
21
22def renamer(name):
23 # "@_%Y%m_データ" を datetime に変換する。
24 date = pd.to_datetime(name, format="@_%Y%m_データ", errors="coerce", exact=False)
25 if pd.isna(date):
26 return name # "@_{年}{月}_データ" という形式でない場合
27
28 # 何ヶ月前かを計算する。
29 months = (pd.to_datetime("today") - date) // np.timedelta64(1, "M")
30
31 return f"データ_{months}M"
32
33
34df.rename(columns=renamer, inplace=True)
35
36print(df)
37# area データ_1M データ_2M データ_1M データ_2M データ_1M データ_2M
38# Tokyooo 2190 13378 2190 13378 13378 2190 13378
39# Osaka 1904 13378 2190 13378 13378 2190 13378
40# Chibaaa 5157 13378 2190 13378 13378 2190 13378
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/11 01:57
2019/06/11 04:20
2019/06/11 05:56