#はじめに
構想設計の第1ステップである『生データに対し、「社員名と作業時間以外が同じ値ならば作業時間を統合する」処理をかける』が実装できたので取りまとめる。
https://qiita.com/wellwell3176/items/7dba981b479c5933bf5f
図:生データの抜粋
社員名はデータとして不要なので、社員名を削除し、なおかつ社員名以外の情報が全部同じなら作業時間を合算したい
#完成したプログラム
import pandas as pd
df=pd.read_excel('/content/drive/My Drive/Colab Notebooks/data2.xlsx')
df["区分"]=df["区分"]+df["業務"] #後工程で必要なので区分と業務は一括表示にする
df=df.rename(columns = {'区分':'業務区分'} #行の見出しも変更しておく
df["作業時間"] = pd.to_datetime(df["作業時間"],format="%H:%M:%S")
#作業時間が生データだとエクセルのユーザー定義で入力されていたので、フォーマット指定で文字列からdatetimeに変換
df["作業時間"] = df["作業時間"].dt.minute
#数値は[~~分][~~時間]で表示するとの要求があるので、datetimeを[分]に換算したint型にする
df2=df.groupby(["テーマ","月日","国名","業務区分"],as_index=False).sum()
#社員名以外で集約する。df.groupbyの結果は代入しないと保存されないので注意する
df2.to_excel('/content/drive/My Drive/Colab Notebooks/data5.xlsx')
図:プログラムの出力結果
業務区分の文字列結合、社員名の削除、時間の集計が実現しているのでOKとする
#プログラム中に発生したエラーや失敗」とその概要
1. to_datetimeで文字列から時刻に換算できない
df["作業時間"] = pd.to_datetime(df["作業時間"])
-->TypeError: <class 'datetime.time> is not convertible to datetime
#エクセルの「表示形式」に問題が在った。ユーザー定義の「hh:mm」を使っており、デフォルトのto_datetimeではこれが読めなかった
#formatオプションを使い、該当列の記述方式を指定することで解決
df["作業時間"] = pd.to_datetime(df["作業時間"],format="%H:%M:%S") #これでOK
2. 作業時間がgroupbyで集計されない
df["作業時間"] = pd.to_datetime(df["作業時間"],format="%H:%M:%S")
df.groupby("国名").mean()
ValueError: No axis named テーマ for object type <class 'pandas.core.frame.DataFrame'>
上図のように出力されてしまい、「作業時間」での集計が発生しなかった。
原因はdatetime形式がgroupby関数の集計値として認識されなかった為と思われる。
完成品のようにdatetimeをint型に変更して解決。
df["作業時間"] = pd.to_datetime(df["作業時間"],format="%H:%M:%S")
df["作業時間"] = df["作業時間"].dt.minute
df.groupby("国名").mean()
3. AttributeError: 'Series' object has no attribute 'minute'
df["作業時間"] = df["作業時間"].minute #これを使ってエラーが発生
--> AttributeError: 'Series' object has no attribute 'minute'
#.dtが抜けていたので、df["作業時間"]という一連の配列を対象とした処理が行えなかった
df["作業時間"] = df["作業時間"].dt.minute #これが正解
4. ValueError: No axis named HOGE for object type class'pandas.core.frame.DataFrame'
df.groupby("国名","テーマ").sum() #これを使ってエラーが発生
-->ValueError: No axis named テーマ for object type <class 'pandas.core.frame.DataFrame>
#groupby関数で複数のインデックスを使用するときの記述ミス。[]が足りなかった。
df.groupby(["テーマ","国名"]).sum() #これでOK
#参考にしたページ/サイト
rename()でcolumn名の変更ができない https://teratail.com/questions/291634
Pandas の groupby の使い方 https://qiita.com/propella/items/a9a32b878c77222630ae
PandasでSeries.dt()を使って日付を変換する方法 https://qiita.com/Takemura-T/items/79b16313e45576bb6492