Python Pandas:TypeError:+:' datetime.time'不支持的操作数类型和' Timedelta'

时间:2017-04-19 21:50:09

标签: python pandas python-3.6 timedelta python-datetime

我试图在pandas的数据框中添加两个系列,第一个系列是从excel文件导出的24小时时间值(例如17:30),第二个系列是Timedelta中相同长度的系列格式转换为浮点数与' pd.Timedelta'命令。

无论日期如何变化,所需的第三列都是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格式是不可变的。我错过了什么吗?

3 个答案:

答案 0 :(得分:4)

原因

错误很清楚。如果您检查元素的类型,您会发现在某些时候您想要添加datetime.time对象和pandas.Timedelta

日期,时间和时间有两种:

  • python内置于datetime模块,即datetime.timedatetime.datedatetime.timedelta,...
  • pandas / numpy,pandas.Timestamppandas.Timedelta

这两个堆栈与添加或比较等基本操作不兼容。

解决方案1 ​​

将所有内容转换为pandas类型并在最后提取时间

您应该确保dtypes列的datetime64[ns]类似于timedelta64[ns]pd.to_datetime。为此,请尝试使用pd.to_timedeltaDelta明确转换它们。

解决方案2

另一种方法是将datetime.timedelta列转换为您可以尝试的df["end_Time"] = df["Start_Time"] + df["Delta"].map(pd.Timedelta.to_pytimedelta)

df["Delta"]

但根据df["Start_Time"]#define ZEND_FE(name, arg_info) ZEND_FENTRY(name, ZEND_FN(name), arg_info, 0) #define ZEND_FALIAS(name, alias, arg_info) ZEND_FENTRY(name, ZEND_FN(alias), arg_info, 0)

中的内容,您可能会遇到更多错误

答案 1 :(得分:0)

试试这个:

import datetime as dt

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

答案 2 :(得分:0)

我不相信您正在尝试使用datetime.time。但是,你可以采取一些措施来解决问题,只需将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

请注意,我访问了.dt.components.hours系列Timedelta的{​​{1}}。如果你不做这样的事情,你最终也会看到以下内容,因为Timdelta也将跟踪这些日子。

End_Time