質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

10438閲覧

とDataFrameにある日付の型変換とpivot_tableについて

jun.k

総合スコア28

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/09/29 04:21

編集2017/09/29 08:30

時系列データの日時の列をpd.to_datetimeで変換し、それをpivot_tableで整形しようとしているのですが、エラーが出てしまいます。

元のデータフレーム(df)は以下になります(Date-Time列はpd.to_datetime処理後)。
#RIC      Date-Time      Actual
0  DEBUSS=ECI 2004-05-21 21:05:59.920529 96.1
1  DEBUSS=ECI 2004-05-21 21:05:59.920529 96.1
2  DEBUSS=ECI 2004-05-21 21:05:59.920529 96.1
3  DEBUSS=ECI 2004-05-23 21:17:44.859056 96.1
4  DEBUSS=ECI 2004-05-23 21:17:44.859056 96.2

これに対して下記コードを入れました。
df.pivot_table('Date-Time','#RIC','Actual')

すると下記エラーが出ます。
DataError: No numeric types to aggregate

まずDate-Time列に同じ時間が入っていることやデータ型が違うようなので、型変換やresample('D').meanを試みたのですが、下記のとおりうまくいきませんでした(Date-time列は最終的には日単位に、Actual列はmean値にしたいと考えています)。

TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Int64Index'

いつも初歩的でご迷惑をおかけ致しますが、よろしくお願いいたします。

2017/9/29 17:25追記
ファイルを読み込む段階でindex_colsとparse_datesを指定してから、欠損値を

df=df[df.Actual!=0]
df=df.dropna(thresh=2)

で消去した結果、
#RIC      Actual
Date-Time
2004-05-25 08:00:01.499292 DEBUSS=ECI 96.1
2004-05-25 09:27:36.303337 DEBUSS=ECI 96.1
2004-05-25 09:27:36.394152 DEBUSS=ECI 96.1
2004-05-25 09:46:02.514259 DEBUSS=ECI 96.1

ここまできました。次にdf=df.resample('D')としたのですが、ここでエラーになりました。

エラーメッセージは
ataError: No numeric types to aggregate
でした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

magichan

2017/09/29 07:00

一点確認です。pivot_table は行ラベル・列ラベル・値として、それぞれどの値を当てはめようとしているのでしょうか?
jun.k

2017/09/29 08:24

行にはDate-Time・列には#RIC・値にはActualを当てはめようとしています。試行錯誤の結果、進展がありましたので上記更新しました。よろしくお願いいたします。
guest

回答1

0

ベストアンサー

引数の渡し方の問題ではないでしょうか。
とりあえず下記のように動作しております。

Python

1import pandas as pd 2 3df = pd.DataFrame({ 4 'RIC': ['DEBUSS=ECI'] * 5, 5 'Date-Time': ['2004-05-21 21:05:59.920529', 6 '2004-05-21 21:05:59.920529', 7 '2004-05-21 21:05:59.920529', 8 '2004-05-21 21:17:44.859056', 9 '2004-05-21 21:17:44.859056'], 10 'Actual': [96.1,96.1,96.1,96.1,96.2] 11}) 12 13df['Date-Time'] = pd.to_datetime(df['Date-Time']) 14print(df) 15 16print(df.pivot_table(index='Date-Time', columns='RIC', values='Actual')) 17# RIC DEBUSS=ECI 18# Date-Time 19# 2004-05-21 21:05:59.920529 96.10 20# 2004-05-21 21:17:44.859056 96.15 21

投稿2017/09/29 08:36

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jun.k

2017/09/29 08:47

ありがとうございます。 df.pivot_table(index='Date-Time',columns='#RIC',values='Actual')で渡してみましたが、やはり下記エラーになりました。。。。 DataError: No numeric types to aggregate
magichan

2017/09/29 09:04 編集

うーん、何でだろ? 渡しが書いたコードとのデータの違いは何かありますか?
jun.k

2017/09/29 09:27

あるサイトからデータを取得してcsvデータ化した上で、それを読み込んでいるので、そもそものデータ型に問題があるのかもしれません(特にActual列が怪しい感じなんですが、astype(float)とかしてもエラーになってしまうので・・・。退社しなければならない時間になりPCを落としてしまったので、また月曜日にもコードを載せてみます。ありがとうございました。
R.Shigemori

2017/09/29 21:34

エラーメッセージからすると集計対象が数字ではないことが原因のようです。とりあえずdf.info()でcolumnの型を確認するとわかると思います。 要素単位のデータの型はtype()で調べることができます。コードにするとこんな感じでしょうか。 [ type(x) for x in df['Actual'] ]
magichan

2017/10/02 00:49

>astype(float)とかしてもエラーになってしまうので・・・ エラーの原因はそこでしょうね。R.Shigemoriさんがコメントされている通り、pivot_table() 関数では 集計関数(aggfunc)として numpy.mean() がデフォルトで指定されているのですが、その部分で計算できない値が入力されているのかと思います。
jun.k

2017/10/02 02:00

コメントありがとうございます。 df.infoで調べたところ、Acutal列はobjectでした。 <class 'pandas.core.frame.DataFrame'> Int64Index: 1759166 entries, 30 to 6489843 Data columns (total 3 columns): #RIC object Date-Time datetime64[ns] Actual object dtypes: datetime64[ns](1), object(2) memory usage: 53.7+ MB ただ一方で、[type(x) for x in df['Actual']]を実行すると各行float,と表示されています(なぜだか不明です)。 これを下記のとおり型変換しようとしてもうまくいないのですが、他に方法ありますでしょうか。 df["Actual"]=df["Actual"].astype(float) ->ValueError: could not convert string to float: '144,000'
magichan

2017/10/02 02:29

> ValueError: could not convert string to float: '144,000' この部分が "144,000" となっておりますので "." と "," が間違っているのではないでしょうかね。 結果このデータはfloat に変換できずに文字列型として扱われているのかと思います。
jun.k

2017/10/02 03:27

ありがとうございます。144,000は df['Actual']=df['Actual'].replace('144,000',int(144000)) で個別に数値化したのですが、直した後も他にも次々と出てきておりまして、今のところすべて個別に変換作業していますが・・・まだ終わりません・・・・。
jun.k

2017/10/02 03:55

個別修正し、df['Actual']=df['Actual'].astype(float)て゜型変換したうえで、df1=df.pivot_table(index='Date-Time',columns='#RIC',values='Actual') としたら、できました!!!。 その後のresample処理も下記コードでうまくいきました。 df1=df1.dropna(how='all') df1=df1.resample('D').mean() df1=df1.fillna(method='ffill') df1=df1.fillna(method='bfill') 助かりました。どうも有難うございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問