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形式は不変のようです。何か不足していますか?
エラーはかなり明確です。要素のタイプを確認すると、ある時点でdatetime.time
オブジェクトとpandas.Timedelta
を追加しようとしていることがわかります。
日付、時刻、timedeltaには2種類あります。
datetime
モジュールからのpythonの組み込み、つまりdatetime.time
、datetime.date
、datetime.timedelta
、...pandas.Timestamp
、pandas.Timedelta
これら2つのスタックは、追加または比較としての基本的な操作には互換性がありません。
すべてをpandasタイプに変換し、最後に時間を抽出します
列のdtypes
がdatetime64[ns]
やtimedelta64[ns]
のようになっていることを確認してください。そのためには、pd.to_datetime
およびpd.to_timedelta
を使用して明示的に変換してみてください。
別のアプローチは、Delta
列をdatetime.timedelta
に変換することです。
df["end_Time"] = df["Start_Time"] + df["Delta"].map(pd.Timedelta.to_pytimedelta)
ただし、df["Delta"]
とdf["Start_Time"]
の内容によっては、さらにエラーが発生する場合があります
これを試して:
import datetime as dt
df["end_Time"] = df["Start_Time"] + df["Delta"].map(dt.timedelta)
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.hours
のEnd_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