【问题标题】:unsupported operand type(s) for +: 'float' and 'datetime.timedelta'", 'occurred at index 5')+ 不支持的操作数类型:'float' 和 'datetime.timedelta'", '发生在索引 5')
【发布时间】:2020-01-06 22:58:47
【问题描述】:

我有一个带有 date 和 time 输入的数据集。 首先,我编写了代码以在 X3 列中查找 5 值的第一次,并将该时间变为 0。 然后我尝试将 timedelta(hours=1) 添加到范围为 6 的内容中。 然后它给了我这个错误"unsupported operand type(s) for +: 'bool' and 'datetime.timedelta'"

谁能帮我解决这个错误?

我的代码:

data =pd.read_csv('data6.csv')

data['time_diff']= pd.to_datetime(data['date'] + " " + data['time'],
               format='%d/%m/%Y %H:%M:%S', dayfirst=True)
mask = data['X3'].eq(5)
data['duration'] = data[mask].drop_duplicates(['date','X3']).groupby(['date','X3'])['time_diff'].transform('first')
data['duration'] = data['time_diff'].sub(data['duration']).dt.total_seconds().div(3600)
date    time    x3            Time(expected)
10/3/2018   6:15:00     0        NaN
10/3/2018   6:45:00     5        0.0
10/3/2018   7:45:00     0        NaN
10/3/2018   9:00:00     0        NaN
10/3/2018   9:25:00     7        NaN
10/3/2018   9:30:00     0        NaN
10/3/2018   11:00:00    0        NaN
10/3/2018   11:30:00    0        NaN
10/3/2018   13:30:00    0        NaN
10/3/2018   13:50:00    5        NaN
10/3/2018   15:00:00    0        NaN
10/3/2018   15:25:00    0        NaN
10/3/2018   16:25:00    0        NaN
10/3/2018   18:00:00    7        NaN
10/3/2018   19:00:00    0        NaN
10/3/2018   19:30:00    0        NaN
10/3/2018   20:00:00    0        NaN
10/3/2018   22:05:00    0        NaN
10/3/2018   22:15:00    5        NaN
10/3/2018   23:40:00    0        NaN
10/4/2018   6:58:00     5        0.0
10/4/2018   13:00:00    0        NaN
10/4/2018   16:00:00    7        NaN
10/4/2018   17:00:00    7        NaN

所以这里我有一个求和方程来应用 X3 列值。

然后根据这个求和方程,我想每小时取 X3 的值。

这就是为什么我首先找到每天提及值5的开始时间,然后将该时间转换为0:00:00。

然后从那个开始时间增加一小时一小时到六小时,我需要取 A 的值。

对于一个方程是:

A =  X3(5) - M

所以我首先分别取了第一次,只取了 0 次。 为此,我使用了代码:

time= data['duration'].eq(0)

然后我在类里面写了这个方程方法

time=0
M=0
for _ in range(len(data['X3'])):
  if X3.all()==5:
    if time ==data['duration'].eq(5).all():
        M=X3
        for i in (time + timedelta(hours=1*it) for it in range(6)):
            M = 5 - 0.0015 * np.sum(i*X3) 
print(M)   

然后得到的值只有 0 。

然后这个错误来了。

从这些代码中我期望的输出是:

					
	   time	 	                      expected output		
	0 (start time of x3 value of 5)         5		
	1 hr		                   5-0.3(according to the summation equation) = 4.7		
	2hr		                      5-0.6=4.4		
	3hr		                      5-0.9=4.1		
	4hr		                      5-1.2=3.8		
	5hr		                      5-1.5=3.5		
	6hr		                      5-1.8=3.2		

【问题讨论】:

  • 为了让社区能够回答您的问题,请以我们可以复制和粘贴的格式添加您正在使用的数据(或者更准确地说,是重现错误的最小示例)检查什么会起作用(即不是屏幕截图)。要了解如何处理 pandas 问题,请访问:stackoverflow.com/questions/20109391/…
  • @Itamar Mushkin 是的,我编辑了我的问题。我希望你现在能理解你的问题。
  • 超级,问题更好。但我想问大约 6 个小时。这意味着 X3== 5 之后的下 6 行? time 中的值在time + timedelta(hours=1*it) 中的解决方案中使用是什么原因?列time 的值有一些过滤?
  • 另外,如果检查您的预期输出,则从 5 中减去 [0,0.3,0.6,1.2,..]?那么time 列值不用于计数吗?
  • @jezrael 实际上我想说的是,在 X3 列中有 5 个值。前 5 个值从早上 6:45:00 开始。所以我的第一次是这个,它被称为 00:00:00。假设我们绘制图表。 x轴是时间。则 0 时 y 值为 5。从该值开始,从开始时间 1 小时开始,1 小时值将根据 6 小时范围内的求和方程值减少。这就是为什么我想取 X3 ==5 值的开始时间。这些预期输出将随时间保存在另一个数据 csv 中。

标签: python pandas time


【解决方案1】:

在您的代码time= data['duration'].eq(0) 中,这部分使time 变量为 bool 类型。 尝试将其转换为0 or 1,然后将其添加到 for 循环中。

如果time 是标量(单个)值:

if (time==True):
    time=1
else:
    time=0

如果time 是向量(数组):

time_array = [0 if tm==False else 1 for tm in data['duration'].eq(0)]

另外,你的 for 循环中还有一个错误。您不能像这样将1 添加到数据时间。 试试这个:

from datetime import datetime, timedelta
current_time = datetime.now()
nine_hours_from_now = current_time  + timedelta(hours=9)

在此代码中,您可以将 timedelta(hours=9) 替换为您的时间 timedelta(hours = time)

注意:您的time 将是一个二进制数组。你必须逆向选择值并添加。

【讨论】:

  • 感谢您的快速回复。不,此代码会给出另一个错误,例如“系列的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。”跨度>
  • 在你的最后一个 for 循环中还有一个问题,我已经编辑了我的答案,请看一下,希望这会有所帮助。
  • 我猜你没有理解我的问题。抱歉,您的代码未更正。感谢您尝试并回复我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
相关资源
最近更新 更多