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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

3回答

2143閲覧

pandasによる時間の計算について

user9801

総合スコア2

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/11/10 03:44

前提・実現したいこと

webにて勤怠を管理しています。
出勤・退勤・残業時間がwebにて確認できます。
しかし、月単位のエクスポートが出来ずに困っていたところPythonでスクレイピングにて値を取得し
Excelと連携を検討しております。

出勤・退勤時間・残業時間については問題なく取得出来ているのですが
しかし、残業時間が00:30と表示されます。
これを0.5と表示しExcelにて保存したいです。

Excelに保存し起動させ該当のセルに*24をすると0.5と表示されます。
Python側にて処理を完結したい。

■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

特になし

該当のソースコード

z = [] for elem_a in driver.find_elements_by_xpath('//*[@id="attendance_detail"]/section/table/tbody/tr/td[15]'): z.append({ "残業時間":elem_a.text })

試したこと

df['残業時間'] = df['残業時間'] * 24

上記の計算をすると下記の様に表示されます。

0 02:3002:3002:3002:3002:3002:3002:3002:3002:300...
1
2 00:3000:3000:3000:3000:3000:3000:3000:3000:300...
3
4
5 00:3000:3000:3000:3000:3000:3000:3000:3000:300...
6 00:3000:3000:3000:3000:3000:3000:3000:3000:300...
7 00:3000:3000:3000:3000:3000:3000イメージ説明:3000:3000:300...

また、dtypesにて該当の属性を調べたら下記の様に表示されています。

残業時間 object

補足情報(FW/ツールのバージョンなど)イメージ説明

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

python

1import pandas as pd 2pd.set_option('display.unicode.east_asian_width', True) 3 4df = pd.DataFrame({ 5 '日付': pd.date_range('2021-10-16', '2021-10-27', freq='D'), 6 '残業時間': [ 7 '02:30', '', '00:30', '', '', '00:30', '00:30', '00:30', '', '', '', '', 8 ] 9}) 10 11df['残業時間'] = ( 12 df['残業時間'].str 13 .extract(r'(\d{2}):(\d{2})') 14 .fillna(0).astype(int) 15 .apply(lambda x: x[0]+x[1]/60, axis=1)) 16 17# 18 変換前 変換後 19 20 日付 残業時間 日付 残業時間 210 2021-10-16 02:30 0 2021-10-16 2.5 221 2021-10-17 1 2021-10-17 0.0 232 2021-10-18 00:30 2 2021-10-18 0.5 243 2021-10-19 3 2021-10-19 0.0 254 2021-10-20 4 2021-10-20 0.0 265 2021-10-21 00:30 5 2021-10-21 0.5 276 2021-10-22 00:30 6 2021-10-22 0.5 287 2021-10-23 00:30 7 2021-10-23 0.5 298 2021-10-24 8 2021-10-24 0.0 309 2021-10-25 9 2021-10-25 0.0 3110 2021-10-26 10 2021-10-26 0.0 3211 2021-10-27 11 2021-10-27 0.0

投稿2021/11/12 00:40

melian

総合スコア20655

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

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

0

ベストアンサー

df['残業時間'] が文字列なので *24 すると、文字列が24回繰り返されたものになります。

'HH:MM' な文字列から数値に変換する関数を定義して、map(applyでもいいですが)すればいいと思います。

とりあえず動けばいいならこんな感じです。

python

1def conv_zangyo(s): 2 try: 3 h, m = s.split(':') 4 return int(h) + int(m) / 60 5 except: 6 return 0.0 7 8df['残業時間'] = df['残業時間'].map(conv_zangyo)

投稿2021/11/10 05:43

bsdfan

総合スコア4794

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

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

0

webから取得したデータは文字列です。
従って、Pythonでは以下のようになります。

python

1>>> print('02:30' * 24) 202:3002:3002:3002:3002:3002:3002:3002:3002:3002:3002:3002:3002:3002:3002:3002:3002:3002:3002:3002:3002:3002:3002:3002:30

元のデータフレームを前加工して'2021-10-21 8:18'のようにしておいて、pd.to_datetimeでdatetime型に変換すれば、やりたいことは簡単にできます。
変換は以下のようにやります。

python

1>>> print(df) 2 日時 30 2021-10-21 8:18 4>>> print(df['日時']) 50 2021-10-21 8:18 6Name: 日時, dtype: object 7>>> pd.to_datetime(df['日時']) 80 2021-10-21 08:18:00 9Name: 日時, dtype: datetime64[ns]

その他の処理も合わせてpandasで日付・時間の列を処理(文字列変換、年月日抽出など)に書かれているので、それを読んでやってみてください。

投稿2021/11/10 04:23

ppaul

総合スコア24670

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

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

user9801

2021/11/10 07:47

>元のデータフレームを前加工して'2021-10-21 8:18'のようにしておいて こちらの加工の仕方が分からず困っております。 単純に日付と残業時間を結合してdatetimeをすれば出来ると思ったのですが"ParserError: Unknown string format:"がエラーが表示されます。 教えて頂いた"pandasで日付・時間の列を処理(文字列変換、年月日抽出など)"にて勉強をしようと思います。
ppaul

2021/11/11 23:05

>>> print(df) 日付 出勤時間 0 2021-10-16(月) 8:1 1 2021-10-18(西) 17:55 >>> print(df['日付'].str[:-3] + ' ' + df['出勤時間']) 0 2021-10-16 8:1 1 2021-10-18 17:55 dtype: object というようにやります。
user9801

2021/11/12 12:58

助かりました。 1点確認になります。 str[:-3]ですがなぜ、strになるのかわかりません。 日付はobjectとなっています。 object=str型と言う認識でよろしいでしょうか。
bsdfan

2021/11/12 13:35

質問者さんは、時刻ではなく時間の文字列を数値化したいとのことなので、pandas.to_datetime()を勧めるのは、ミスリーディングな解答に思えます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問