質問編集履歴

4

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

2019/12/10 01:42

投稿

EM1206
EM1206

スコア30

test CHANGED
File without changes
test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  当該処理の実現方法がわかる方いましたら、ご教示いただきたく宜しくお願い致します。
18
18
 
19
-
19
+ ↓元データ
20
20
 
21
21
  |OUTPUT_DAY|KOJI_NO|YOTEI_YMD|
22
22
 
@@ -30,7 +30,7 @@
30
30
 
31
31
  |20191106|A12345|20190827|
32
32
 
33
- |20191107|A12345|20190827|
33
+ |20191107|A12345|20190828|
34
34
 
35
35
  |20191108|A12345|20190824|
36
36
 
@@ -45,6 +45,40 @@
45
45
  |20191107|B12345|20190827|
46
46
 
47
47
  |20191108|B12345|20190827|
48
+
49
+
50
+
51
+
52
+
53
+ ↓求めたいデータ(days_diffとmonths_diffをconcat(axis=1)で結合)
54
+
55
+ |OUTPUT_DAY|KOJI_NO|YOTEI_YMD|days_diff|months_diff
56
+
57
+ |---|---|---|---|---|
58
+
59
+ |20191101|A12345|20190708|Nan|Nan
60
+
61
+ |20191102|A12345|20190827|50|1
62
+
63
+ |20191103|A12345|20190827|0|0
64
+
65
+ |20191106|A12345|20190827|0|0
66
+
67
+ |20191107|A12345|20190828|1|0
68
+
69
+ |20191108|A12345|20190824|-4|0
70
+
71
+ |20191101|B12345|20190704|Nan|Nan
72
+
73
+ |20191102|B12345|20190708|4|0
74
+
75
+ |20191103|B12345|20190827|0|0
76
+
77
+ |20191106|B12345|20190827|0|0
78
+
79
+ |20191107|B12345|20190827|0|0
80
+
81
+ |20191108|B12345|20190827|0|0
48
82
 
49
83
 
50
84
 

3

2019/12/10 01:42

投稿

EM1206
EM1206

スコア30

test CHANGED
File without changes
test CHANGED
@@ -84,7 +84,7 @@
84
84
 
85
85
 
86
86
 
87
- months_diff = df_sort.groupby(['KOJI_NO'])['YOTEI_YMD'].rolling(2).apply(func_diff_month)
87
+ months_diff = df.groupby(['KOJI_NO'])['YOTEI_YMD'].rolling(2).apply(func_diff_month)
88
88
 
89
89
  ```
90
90
 

2

修正

2019/12/09 12:21

投稿

EM1206
EM1206

スコア30

test CHANGED
File without changes
test CHANGED
@@ -70,6 +70,8 @@
70
70
 
71
71
 
72
72
 
73
+ df['YOTEI_YMD'] = pd.to_datetime(df['YOTEI_YMD'], format='%Y%m%d')
74
+
73
75
  days_diff = df.groupby(['KOJI_NO'])['YOTEI_YMD'].diff()
74
76
 
75
77
 

1

足りない点を加筆

2019/12/09 11:25

投稿

EM1206
EM1206

スコア30

test CHANGED
@@ -1 +1 @@
1
- pandas.DataFrameでの月数差分を求めたい。rolling() relativedelta()
1
+ pandas.DataFrameで日付カラムの月数差分を求めたい。rolling() relativedelta()
test CHANGED
@@ -8,7 +8,15 @@
8
8
 
9
9
  ### 発生している問題・エラーメッセージ
10
10
 
11
- 以下のようなデータが有り、KOJI_NOで
11
+ 以下のようなデータが有り、KOJI_NOでgroupbyしてYOTEI_YMDの差分(変化)を求めようとしています。
12
+
13
+ YOTEI_YMDをpd.to_datetime()してからdiff()で日数差分は求められました。
14
+
15
+ rolling()とrelativedelta()を組み合わせた関数で月数差分を求めようとしたのですが上手くいきません。
16
+
17
+ 当該処理の実現方法がわかる方いましたら、ご教示いただきたく宜しくお願い致します。
18
+
19
+
12
20
 
13
21
  |OUTPUT_DAY|KOJI_NO|YOTEI_YMD|
14
22
 
@@ -52,11 +60,29 @@
52
60
 
53
61
  ### 該当のソースコード
54
62
 
55
-
63
+ months_diffを求めるコードでエラーとなってしまします。
56
64
 
57
65
  ```python
58
66
 
67
+ import pandas as pd
59
68
 
69
+ from dateutil import relativedelta as rdelta
70
+
71
+
72
+
73
+ days_diff = df.groupby(['KOJI_NO'])['YOTEI_YMD'].diff()
74
+
75
+
76
+
77
+ def func_diff_month(x):
78
+
79
+ m0, m1 = x[0], x[1]
80
+
81
+ return rdelta.relativedelta(m0, m1).months
82
+
83
+
84
+
85
+ months_diff = df_sort.groupby(['KOJI_NO'])['YOTEI_YMD'].rolling(2).apply(func_diff_month)
60
86
 
61
87
  ```
62
88
 
@@ -66,12 +92,4 @@
66
92
 
67
93
 
68
94
 
69
- ここに問題に対して試したことを記載してください。
70
-
71
-
72
-
73
- ### 補足情報(FW/ツールバージョンなど)
95
+ rolling(2)窓サイズの要素を、relativedelta().monthsで月数差分を取得しようとしました。
74
-
75
-
76
-
77
- ここにより詳細な情報を記載してください。