前提・実現したいこと
- DataFrameの特定カラムに入っているTimeStampの月数差分を求めたい
- 日数差分はdiff()で求められたが、差分が月を跨いでいるかを判定したい
発生している問題・エラーメッセージ
以下のようなデータが有り、KOJI_NOでgroupbyしてYOTEI_YMDの差分(変化)を求めようとしています。
YOTEI_YMDをpd.to_datetime()してからdiff()で日数差分は求められました。
rolling()とrelativedelta()を組み合わせた関数で月数差分を求めようとしたのですが上手くいきません。
当該処理の実現方法がわかる方いましたら、ご教示いただきたく宜しくお願い致します。
↓元データ
OUTPUT_DAY | KOJI_NO | YOTEI_YMD |
---|---|---|
20191101 | A12345 | 20190708 |
20191102 | A12345 | 20190827 |
20191103 | A12345 | 20190827 |
20191106 | A12345 | 20190827 |
20191107 | A12345 | 20190828 |
20191108 | A12345 | 20190824 |
20191101 | B12345 | 20190704 |
20191102 | B12345 | 20190708 |
20191103 | B12345 | 20190827 |
20191106 | B12345 | 20190827 |
20191107 | B12345 | 20190827 |
20191108 | B12345 | 20190827 |
↓求めたいデータ(days_diffとmonths_diffをconcat(axis=1)で結合)
OUTPUT_DAY | KOJI_NO | YOTEI_YMD | days_diff | months_diff |
---|---|---|---|---|
20191101 | A12345 | 20190708 | Nan | Nan |
20191102 | A12345 | 20190827 | 50 | 1 |
20191103 | A12345 | 20190827 | 0 | 0 |
20191106 | A12345 | 20190827 | 0 | 0 |
20191107 | A12345 | 20190828 | 1 | 0 |
20191108 | A12345 | 20190824 | -4 | 0 |
20191101 | B12345 | 20190704 | Nan | Nan |
20191102 | B12345 | 20190708 | 4 | 0 |
20191103 | B12345 | 20190827 | 0 | 0 |
20191106 | B12345 | 20190827 | 0 | 0 |
20191107 | B12345 | 20190827 | 0 | 0 |
20191108 | B12345 | 20190827 | 0 | 0 |
DataError: No numeric types to aggregate
該当のソースコード
months_diffを求めるコードでエラーとなってしまします。
python
1import pandas as pd 2from dateutil import relativedelta as rdelta 3 4df['YOTEI_YMD'] = pd.to_datetime(df['YOTEI_YMD'], format='%Y%m%d') 5days_diff = df.groupby(['KOJI_NO'])['YOTEI_YMD'].diff() 6 7def func_diff_month(x): 8 m0, m1 = x[0], x[1] 9 return rdelta.relativedelta(m0, m1).months 10 11months_diff = df.groupby(['KOJI_NO'])['YOTEI_YMD'].rolling(2).apply(func_diff_month)
試したこと
rolling(2)の窓サイズの要素を、relativedelta().monthsで月数差分を取得しようとしました。
回答1件
あなたの回答
tips
プレビュー