我试图在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格式是不可变的。我错过了什么吗?
答案 0 :(得分:4)
错误很清楚。如果您检查元素的类型,您会发现在某些时候您想要添加datetime.time
对象和pandas.Timedelta
。
日期,时间和时间有两种:
datetime
模块,即datetime.time
,datetime.date
,datetime.timedelta
,... pandas.Timestamp
,pandas.Timedelta
这两个堆栈与添加或比较等基本操作不兼容。
将所有内容转换为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"]
和#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