0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

備忘録(「ユーザー定義」された時刻の取得・換算、クロス集計)

Last updated at Posted at 2020-09-28

#はじめに
構想設計の第1ステップである『生データに対し、「社員名と作業時間以外が同じ値ならば作業時間を統合する」処理をかける』が実装できたので取りまとめる。
https://qiita.com/wellwell3176/items/7dba981b479c5933bf5f
image.png
            図:生データの抜粋
社員名はデータとして不要なので、社員名を削除し、なおかつ社員名以外の情報が全部同じなら作業時間を合算したい
#完成したプログラム

program
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')

image.png
 図:プログラムの出力結果
業務区分の文字列結合、社員名の削除、時間の集計が実現しているので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'>

image.png
上図のように出力されてしまい、「作業時間」での集計が発生しなかった。
原因はdatetime形式がgroupby関数の集計値として認識されなかった為と思われる。
完成品のようにdatetimeをint型に変更して解決。

成功バージョン
df["作業時間"] = pd.to_datetime(df["作業時間"],format="%H:%M:%S") 
df["作業時間"] = df["作業時間"].dt.minute 

df.groupby("国名").mean()

image.png
これで作業時間が集計側に~~[分]の形で取り込めた。

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?