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

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

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

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

Q&A

解決済

1回答

795閲覧

python DataFrame 型の変更

nao0405

総合スコア1

Python

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

0グッド

0クリップ

投稿2021/08/24 08:26

前提・実現したいこと

エクセルからデータを取り込み

取り込んだデータ内のNoと時間の列を参照

同じNoの時間を全て合算

csvデータへ書き込みをしようと考えています。

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

データを取り込むと
イメージ説明
と出るのですが、typeがobjectとなっています。

pd.to_datetimeにてdtype: datetime64[ns]への変換を試みましたが
以下のエラーが発生します。
イメージ説明

typeを変更出来ればgroupbyを用いで合算できるのではないかと考えていますが
その前で躓いています。

ご教授お願い致します。

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

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

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

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

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

meg_

2021/08/24 08:59

エラーメッセージを見る限り(KeyError:'時間')、対象の列が存在しないとしか思えませんが。
nao0405

2021/08/25 00:07

ご回答ありがとう御座います。 仮にpd.DataFrameにて同様の表を入力し、to_datetimeにて変換を行うと正常に処理が出来ました。 なので記述等的には問題無いかなと考えその他の解決策や誤りが無いかわからず 問い合わせをさせて頂きました。 他の方法含め模索したいと思います。
guest

回答1

0

ベストアンサー

  • typeを変更出来ればgroupbyを用いで合算できるのではないかと考えていますが

それだけでできるほど簡単な問題ではありません。

理由
0. Excelには時間という表記はあるがそれは時刻であり時間ではない。
0. Pythonの時間処理のdatetime.timeは足し算も引き算もできない。

そのため、以下のようにかなり複雑な処理が必要になります。

python

1>>> from datetime import timedelta 2>>> 3>>> def td_format(td): 4... total_seconds = int(td.total_seconds()) 5... seconds = total_seconds % 60 6... total_minutes = total_seconds // 60 7... minutes = total_minutes % 60 8... hours = total_minutes // 60 9... return f'{hours:02}:{minutes:02}:{seconds:02}' 10... 11>>> print(df) 12 No 時間 130 9144020 07:50:00 141 9144030 06:00:00 152 9144030 04:00:00 16>>> print(df['時間']) 170 07:50:00 181 06:00:00 192 04:00:00 20Name: 時間, dtype: object 21>>> df['時間'] = df['時間'].apply(lambda t: timedelta(hours=t.hour, minutes=t.minute, seconds=t.second)) 22>>> df_output = df.groupby('No').sum() 23>>> df_output['時間'] = df_output['時間'].apply(td_format) 24>>> df_output.reset_index(inplace=True) 25>>> print(df_output) 26 No 時間 270 9144020 07:50:00 281 9144030 10:00:00

データが画像なので3行だけです。

投稿2021/08/24 10:45

ppaul

総合スコア24666

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

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

nao0405

2021/08/25 00:16

ご丁寧な回答ありがとう御座います。 >Excelには時間という表記はあるがそれは時刻であり時間ではない。 >Pythonの時間処理のdatetime.timeは足し算も引き算もできない。 独学を始めた初心者な者で大変勉強になります。 ご提案頂いた内容にて1度試したい思います。 また、今回例に挙げていませんが、時間を10進で表した物を元データ(Excel)には格納しています。 そちらを用いて合算する方法も試してみたいと思います。
ppaul

2021/08/25 14:42

時間と時刻の違いは理解できていますか。 朝の8時に1時間かけて朝食を食べたときの朝8時は時刻で、1時間は時間です。 蛭の12時に1時間かけて朝食を食べたとしましょう。 1時間と1時間を足した2時間は合計の食事時間ですが、8時と12時を足して20時を出したとしてもその数字には意味がありません。 Excelはその区別がないのが問題です。 Pythonのdatetime.datetimeとdatetime.timedeltaは時間と時刻を表しているのでExcelよりマシなのですが、datetime.timeは時刻であるにもかかわらず、引き算ができないので、今回はそこが障害となっています。 時間を10進で表すというのが130で1時間30分を表しているのであれば130と140の合計の処理をどうするのかをやるのが大変ですよ。
nao0405

2021/08/29 23:48

補足ありがとう御座います。 ご回答頂いた内容で狙い通り事が出来ました。 ご丁寧にありがとう御座います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問