回答編集履歴

4

d

2019/06/11 04:21

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -102,7 +102,7 @@
102
102
 
103
103
  pandas.to_datetime() に exact=False を追加してください。
104
104
 
105
- これにより、列名の一部 `@_{年}{月}_データ` とマッチすれば、日付に変換できます。
105
+ これにより、列名の一部 `@_{年}{月}_データ` とマッチすれば、日付に変換できます。
106
106
 
107
107
 
108
108
 

3

d

2019/06/11 04:21

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -89,3 +89,125 @@
89
89
  # Chibaaa 5157 13378 2190 13378
90
90
 
91
91
  ```
92
+
93
+
94
+
95
+ ## 追記
96
+
97
+
98
+
99
+ > 複数パターン存在する場合は、どのようにループさせていけば良いでしょうか..?
100
+
101
+
102
+
103
+ pandas.to_datetime() に exact=False を追加してください。
104
+
105
+ これにより、列名の一部に `@_{年}{月}_データ` とマッチすれば、日付に変換できます。
106
+
107
+
108
+
109
+ [pandas.to_datetime — pandas 0.24.2 documentation](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html)
110
+
111
+
112
+
113
+ 変更箇所
114
+
115
+
116
+
117
+ ```diff
118
+
119
+ - date = pd.to_datetime(name, format="@_%Y%m_データ", errors="coerce")
120
+
121
+ + date = pd.to_datetime(name, format="@_%Y%m_データ", errors="coerce", exact=False)
122
+
123
+ ```
124
+
125
+
126
+
127
+ 修正後のコード全体
128
+
129
+
130
+
131
+ ```python
132
+
133
+ import pandas as pd
134
+
135
+ import numpy as np
136
+
137
+
138
+
139
+ df = pd.DataFrame(
140
+
141
+ [
142
+
143
+ [2190, 13378, 2190, 13378, 13378, 2190, 13378],
144
+
145
+ [1904, 13378, 2190, 13378, 13378, 2190, 13378],
146
+
147
+ [5157, 13378, 2190, 13378, 13378, 2190, 13378],
148
+
149
+ ],
150
+
151
+ columns=[
152
+
153
+ "area",
154
+
155
+ "@_201905_データA",
156
+
157
+ "@_201904_データA",
158
+
159
+ "@_201905_データB",
160
+
161
+ "@_201904_データB",
162
+
163
+ "@_201905_データC",
164
+
165
+ "@_201904_データC",
166
+
167
+ ],
168
+
169
+ index=["Tokyooo", "Osaka", "Chibaaa"],
170
+
171
+ )
172
+
173
+
174
+
175
+ def renamer(name):
176
+
177
+ # "@_%Y%m_データ" を datetime に変換する。
178
+
179
+ date = pd.to_datetime(name, format="@_%Y%m_データ", errors="coerce", exact=False)
180
+
181
+ if pd.isna(date):
182
+
183
+ return name # "@_{年}{月}_データ" という形式でない場合
184
+
185
+
186
+
187
+ # 何ヶ月前かを計算する。
188
+
189
+ months = (pd.to_datetime("today") - date) // np.timedelta64(1, "M")
190
+
191
+
192
+
193
+ return f"データ_{months}M"
194
+
195
+
196
+
197
+
198
+
199
+ df.rename(columns=renamer, inplace=True)
200
+
201
+
202
+
203
+ print(df)
204
+
205
+ # area データ_1M データ_2M データ_1M データ_2M データ_1M データ_2M
206
+
207
+ # Tokyooo 2190 13378 2190 13378 13378 2190 13378
208
+
209
+ # Osaka 1904 13378 2190 13378 13378 2190 13378
210
+
211
+ # Chibaaa 5157 13378 2190 13378 13378 2190 13378
212
+
213
+ ```

2

d

2019/06/11 04:20

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -18,6 +18,10 @@
18
18
 
19
19
  ```python
20
20
 
21
+
22
+
23
+
24
+
21
25
  import pandas as pd
22
26
 
23
27
  import numpy as np
@@ -36,7 +40,7 @@
36
40
 
37
41
  ],
38
42
 
39
- columns=["area", "@_201905_データ", "@_201905_データ", "@_201905_データ"],
43
+ columns=["area", "@_201905_データ", "@_201904_データ", "@_201903_データ"],
40
44
 
41
45
  index=["Tokyooo", "Osaka", "Chibaaa"],
42
46
 
@@ -76,7 +80,7 @@
76
80
 
77
81
  print(df)
78
82
 
79
- # area データ_1M データ_1M データ_1M
83
+ # area データ_1M データ_2M データ_3M
80
84
 
81
85
  # Tokyooo 2190 13378 2190 13378
82
86
 

1

d

2019/06/10 09:47

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -6,9 +6,9 @@
6
6
 
7
7
 
8
8
 
9
- 1. pd.to_datetime で "@_%Y%m_データ" を datetime に変換する。
9
+ 1. pd.to_datetime で "@_{年}{月}_データ" を datetime に変換する。
10
10
 
11
- 2. pd.isna() を調べて、"area" のような "@_%Y%m_データ" という形式でない列は変更しないでそのまま返す。
11
+ 2. pd.isna() を調べて、"area" のような "@_{年}{月}_データ" という形式でない列は変更しないでそのまま返す。
12
12
 
13
13
  3. 今日の datetime との差分を計算し、何ヶ月前かを調べる。
14
14