비망록(「사용자 정의」된 시각의 취득·환산, 크로스 집계)

소개



구상 설계의 제1 스텝인 「원 데이터에 대해, 「사원명과 작업 시간 이외가 같은 값이라면 작업 시간을 통합한다」처리를 거는」를 실장할 수 있었기 때문에 정리한다.
htps : // 이 m / ぇ ぇ l ぇ l 3176 / ms / 7d 981b479c5933bf5f

           그림 : 원시 데이터 발췌
직원 이름은 데이터로 필요하지 않으므로 직원 이름을 삭제하고 직원 이름 이외의 정보가 모두 동일하면 작업 시간을 합산하고 싶습니다.

완성된 프로그램



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


그림: 프로그램의 출력 결과
업무 구분의 문자열 결합, 사원명의 삭제, 시간의 집계가 실현되고 있으므로 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 ()을 사용하여 열 이름을 변경할 수 없습니다 htps : // 놀라운 l. 코m/쿠에 s치온 s/291634
Pandas groupby 사용법 htps : // 코 m / p 로페 / ms / 아 9 아 32b878c77222630
Pandas에서 Series.dt ()를 사용하여 날짜를 변환하는 방법 htps : // 코 m / 타케무라 T / ms / 79b16313 45576 b6492

좋은 웹페이지 즐겨찾기