web-dev-qa-db-ja.com

Python Pandas:TypeError:Unsupported operand type(s)for +: 'datetime.time' and 'Timedelta'

pandas=のデータフレームに2つのシリーズを追加しようとしています。最初のシリーズはExcelファイルからエクスポートされた24時間の時間値(例、17:30)で、2番目のシリーズはシリーズです。 'pd.Timedelta'コマンドで浮動小数点数から変換された同じ長さのTimedelta形式。

望ましい結果の3番目の列は、日の変更に関係なく24時間です(例:22:00 + 4時間= 02:00)。

私はこのようなDeltaシリーズを作成しました:

delta = pd.Series(0 for x in range(0, len(df.Time_In_Hours)))

for j in range(0, len(df.Time_In_Hours)):
    delta[j] = pd.Timedelta(df.Time_In_Hours[j], 'h')
df = df.assign(Delta = delta)   
print ("Delta dtype = %s" % (df.Delta.dtype))
print ("Start_Time dtype = %s" % (df.Start_Time.dtype))

#Output
Delta dtype = object
Start_Time dtype = object

私の目標は:

df["end_Time"] = df["Start_Time"] + df["Delta"]  

私が受け取っているエラーは次のとおりです:TypeError:サポートされていないオペランドタイプ+: 'datetime.time'および 'Timedelta'

このdatetime.time形式は不変のようです。何か不足していますか?

6
DoctorWhom

原因

エラーはかなり明確です。要素のタイプを確認すると、ある時点でdatetime.timeオブジェクトとpandas.Timedeltaを追加しようとしていることがわかります。

日付、時刻、timedeltaには2種類あります。

  • datetimeモジュールからのpythonの組み込み、つまりdatetime.timedatetime.datedatetime.timedelta、...
  • パンダ/ numpy、つまりpandas.Timestamppandas.Timedelta

これら2つのスタックは、追加または比較としての基本的な操作には互換性がありません。

解決策1

すべてをpandasタイプに変換し、最後に時間を抽出します

列のdtypesdatetime64[ns]timedelta64[ns]のようになっていることを確認してください。そのためには、pd.to_datetimeおよびpd.to_timedeltaを使用して明示的に変換してみてください。

解決策2

別のアプローチは、Delta列をdatetime.timedeltaに変換することです。

df["end_Time"] = df["Start_Time"] + df["Delta"].map(pd.Timedelta.to_pytimedelta)

ただし、df["Delta"]df["Start_Time"]の内容によっては、さらにエラーが発生する場合があります

8
matusko

これを試して:

import datetime as dt

df["end_Time"] = df["Start_Time"] + df["Delta"].map(dt.timedelta)
0
zipa

datetime.timeでの作業はお勧めしていません。ただし、問題を回避するためにできることの1つは、datetime.timeを文字列にキャストし、それをpd.Timedeltaに変換してから追加することです。そのようです:

print(df)
   Start_Time    Delta
0    00:00:00 00:00:00
1    01:00:00 01:00:00
2    02:00:00 02:00:00
3    03:00:00 03:00:00
4    04:00:00 04:00:00
5    05:00:00 05:00:00
6    06:00:00 06:00:00
7    07:00:00 07:00:00
8    08:00:00 08:00:00
9    09:00:00 09:00:00
10   10:00:00 10:00:00
11   11:00:00 11:00:00
12   12:00:00 12:00:00
13   13:00:00 13:00:00
14   14:00:00 14:00:00
15   15:00:00 15:00:00
16   16:00:00 16:00:00
17   17:00:00 17:00:00
18   18:00:00 18:00:00
19   19:00:00 19:00:00

df['End_Time'] = (pd.to_timedelta(df.Start_Time.astype(str)) + df.Delta).dt.components.hours
print(df)
   Start_Time    Delta  End_Time
0    00:00:00 00:00:00         0
1    01:00:00 01:00:00         2
2    02:00:00 02:00:00         4
3    03:00:00 03:00:00         6
4    04:00:00 04:00:00         8
5    05:00:00 05:00:00        10
6    06:00:00 06:00:00        12
7    07:00:00 07:00:00        14
8    08:00:00 08:00:00        16
9    09:00:00 09:00:00        18
10   10:00:00 10:00:00        20
11   11:00:00 11:00:00        22
12   12:00:00 12:00:00         0
13   13:00:00 13:00:00         2
14   14:00:00 14:00:00         4
15   15:00:00 15:00:00         6
16   16:00:00 16:00:00         8
17   17:00:00 17:00:00        10
18   18:00:00 18:00:00        12
19   19:00:00 19:00:00        14

Timedeltaシリーズ.dt.components.hoursEnd_Timeにアクセスしたことに注意してください。このようなことを行わないと、Timdeltaが日も追跡するため、次の結果も表示されます。

   Start_Time    Delta        End_Time
0    00:00:00 00:00:00 0 days 00:00:00
1    01:00:00 01:00:00 0 days 02:00:00
2    02:00:00 02:00:00 0 days 04:00:00
3    03:00:00 03:00:00 0 days 06:00:00
4    04:00:00 04:00:00 0 days 08:00:00
5    05:00:00 05:00:00 0 days 10:00:00
6    06:00:00 06:00:00 0 days 12:00:00
7    07:00:00 07:00:00 0 days 14:00:00
8    08:00:00 08:00:00 0 days 16:00:00
9    09:00:00 09:00:00 0 days 18:00:00
10   10:00:00 10:00:00 0 days 20:00:00
11   11:00:00 11:00:00 0 days 22:00:00
12   12:00:00 12:00:00 1 days 00:00:00
13   13:00:00 13:00:00 1 days 02:00:00
14   14:00:00 14:00:00 1 days 04:00:00
15   15:00:00 15:00:00 1 days 06:00:00
16   16:00:00 16:00:00 1 days 08:00:00
17   17:00:00 17:00:00 1 days 10:00:00
18   18:00:00 18:00:00 1 days 12:00:00
19   19:00:00 19:00:00 1 days 14:00:00
0
Grr