質問するログイン新規登録

質問編集履歴

4

求めたいデータを追記しました。

2019/12/10 01:42

投稿

EM1206
EM1206

スコア30

title CHANGED
File without changes
body CHANGED
@@ -7,14 +7,14 @@
7
7
  YOTEI_YMDをpd.to_datetime()してからdiff()で日数差分は求められました。
8
8
  rolling()とrelativedelta()を組み合わせた関数で月数差分を求めようとしたのですが上手くいきません。
9
9
  当該処理の実現方法がわかる方いましたら、ご教示いただきたく宜しくお願い致します。
10
-
10
+ ↓元データ
11
11
  |OUTPUT_DAY|KOJI_NO|YOTEI_YMD|
12
12
  |---|---|---|
13
13
  |20191101|A12345|20190708|
14
14
  |20191102|A12345|20190827|
15
15
  |20191103|A12345|20190827|
16
16
  |20191106|A12345|20190827|
17
- |20191107|A12345|20190827|
17
+ |20191107|A12345|20190828|
18
18
  |20191108|A12345|20190824|
19
19
  |20191101|B12345|20190704|
20
20
  |20191102|B12345|20190708|
@@ -23,6 +23,23 @@
23
23
  |20191107|B12345|20190827|
24
24
  |20191108|B12345|20190827|
25
25
 
26
+
27
+ ↓求めたいデータ(days_diffとmonths_diffをconcat(axis=1)で結合)
28
+ |OUTPUT_DAY|KOJI_NO|YOTEI_YMD|days_diff|months_diff
29
+ |---|---|---|---|---|
30
+ |20191101|A12345|20190708|Nan|Nan
31
+ |20191102|A12345|20190827|50|1
32
+ |20191103|A12345|20190827|0|0
33
+ |20191106|A12345|20190827|0|0
34
+ |20191107|A12345|20190828|1|0
35
+ |20191108|A12345|20190824|-4|0
36
+ |20191101|B12345|20190704|Nan|Nan
37
+ |20191102|B12345|20190708|4|0
38
+ |20191103|B12345|20190827|0|0
39
+ |20191106|B12345|20190827|0|0
40
+ |20191107|B12345|20190827|0|0
41
+ |20191108|B12345|20190827|0|0
42
+
26
43
  ```
27
44
 
28
45
  DataError: No numeric types to aggregate

3

2019/12/10 01:42

投稿

EM1206
EM1206

スコア30

title CHANGED
File without changes
body CHANGED
@@ -41,7 +41,7 @@
41
41
  m0, m1 = x[0], x[1]
42
42
  return rdelta.relativedelta(m0, m1).months
43
43
 
44
- months_diff = df_sort.groupby(['KOJI_NO'])['YOTEI_YMD'].rolling(2).apply(func_diff_month)
44
+ months_diff = df.groupby(['KOJI_NO'])['YOTEI_YMD'].rolling(2).apply(func_diff_month)
45
45
  ```
46
46
 
47
47
  ### 試したこと

2

修正

2019/12/09 12:21

投稿

EM1206
EM1206

スコア30

title CHANGED
File without changes
body CHANGED
@@ -34,6 +34,7 @@
34
34
  import pandas as pd
35
35
  from dateutil import relativedelta as rdelta
36
36
 
37
+ df['YOTEI_YMD'] = pd.to_datetime(df['YOTEI_YMD'], format='%Y%m%d')
37
38
  days_diff = df.groupby(['KOJI_NO'])['YOTEI_YMD'].diff()
38
39
 
39
40
  def func_diff_month(x):

1

足りない点を加筆

2019/12/09 11:25

投稿

EM1206
EM1206

スコア30

title CHANGED
@@ -1,1 +1,1 @@
1
- pandas.DataFrameでの月数差分を求めたい。rolling() relativedelta()
1
+ pandas.DataFrameで日付カラムの月数差分を求めたい。rolling() relativedelta()
body CHANGED
@@ -3,7 +3,11 @@
3
3
  - 日数差分はdiff()で求められたが、差分が月を跨いでいるかを判定したい
4
4
 
5
5
  ### 発生している問題・エラーメッセージ
6
- 以下のようなデータが有り、KOJI_NOで
6
+ 以下のようなデータが有り、KOJI_NOでgroupbyしてYOTEI_YMDの差分(変化)を求めようとしています。
7
+ YOTEI_YMDをpd.to_datetime()してからdiff()で日数差分は求められました。
8
+ rolling()とrelativedelta()を組み合わせた関数で月数差分を求めようとしたのですが上手くいきません。
9
+ 当該処理の実現方法がわかる方いましたら、ご教示いただきたく宜しくお願い致します。
10
+
7
11
  |OUTPUT_DAY|KOJI_NO|YOTEI_YMD|
8
12
  |---|---|---|
9
13
  |20191101|A12345|20190708|
@@ -25,15 +29,20 @@
25
29
  ```
26
30
 
27
31
  ### 該当のソースコード
28
-
32
+ months_diffを求めるコードでエラーとなってしまします。
29
33
  ```python
34
+ import pandas as pd
35
+ from dateutil import relativedelta as rdelta
30
36
 
37
+ days_diff = df.groupby(['KOJI_NO'])['YOTEI_YMD'].diff()
38
+
39
+ def func_diff_month(x):
40
+ m0, m1 = x[0], x[1]
41
+ return rdelta.relativedelta(m0, m1).months
42
+
43
+ months_diff = df_sort.groupby(['KOJI_NO'])['YOTEI_YMD'].rolling(2).apply(func_diff_month)
31
44
  ```
32
45
 
33
46
  ### 試したこと
34
47
 
35
- ここに問題に対して試したことを記載してください。
36
-
37
- ### 補足情報(FW/ツールバージョンなど)
48
+ rolling(2)窓サイズの要素を、relativedelta().monthsで月数差分を取得しようとしました。
38
-
39
- ここにより詳細な情報を記載してください。