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

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

ただいまの
回答率

90.61%

  • Python 3.x

    5948questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 888

jun.k

score 20

時系列データの日時の列を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
でした。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • magichan

    2017/09/29 16:00

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

    キャンセル

  • jun.k

    2017/09/29 17:24

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

    キャンセル

回答 1

checkベストアンサー

+1

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

import pandas as pd

df = pd.DataFrame({
    'RIC': ['DEBUSS=ECI'] * 5,
    'Date-Time': ['2004-05-21 21:05:59.920529',
                  '2004-05-21 21:05:59.920529',
                  '2004-05-21 21:05:59.920529',
                  '2004-05-21 21:17:44.859056',
                  '2004-05-21 21:17:44.859056'],
    'Actual': [96.1,96.1,96.1,96.1,96.2]
})

df['Date-Time'] = pd.to_datetime(df['Date-Time'])
print(df)

print(df.pivot_table(index='Date-Time', columns='RIC', values='Actual'))
# RIC                         DEBUSS=ECI
# Date-Time
# 2004-05-21 21:05:59.920529       96.10
# 2004-05-21 21:17:44.859056       96.15

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/29 17:47

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

    キャンセル

  • 2017/09/29 18:03 編集

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

    キャンセル

  • 2017/09/29 18:27

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

    キャンセル

  • 2017/09/30 06:34

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

    [ type(x) for x in df['Actual'] ]

    キャンセル

  • 2017/10/02 09:49

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

    キャンセル

  • 2017/10/02 11: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'

    キャンセル

  • 2017/10/02 11:29

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

    キャンセル

  • 2017/10/02 12:27

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

    キャンセル

  • 2017/10/02 12: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')

    助かりました。どうも有難うございました!!!

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    5948questions

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