我有一个像这样的日期框:
ID FirstNumberHour NewFirst LastNumberHour NewLast
1 7.0 7a 4.0 4p
2 2.0 2a 10.0 10p
3 4.0 4p 11.0 11p
FirstNumberHour
变量是通过以下代码从NewFirst
变量创建的:
DF['FirstNumberHourUpdate'] = pd.to_datetime(DF['NewLast']+['m'], format='%H%p').dt.hour
为了将NewFirst
和NewLast
转换为24小时时间变量,我想有条件地将12添加到对应的First/LastNumberHour
具有“p”的时间中。新变量是对象,First/LastNumberHour
是float64。例如,输出表如下所示:
ID FirstNumberHourUpdate NewFirst LastNumberHourUpdate NewLast
1 7.0 7a 16.0 4p
2 2.0 2a 22.0 10p
3 16.0 4p 23.0 11p
我希望进行此转换,同时还要记住,我需要将新创建的hour变量添加到日期变量,创建一个datetime变量
我尝试了下面的代码,但它产生了一个很长的错误
T=12
DF['FirstNumberHourUpdate']=np.where(DF["NewFirst"].str.contains("p"),DF.FirstNumberHour + float(T),DF.FirstNumberHour)
TypeError: can only concatenate str (not "float") to str
读到这个错误TypeError: can only concatenate str (not "float") to str但是根据这个,它说我需要将我的NewFirst变量转换成float变量;但是,如果我这样做,是否能够基于“p”条件执行此查询
答复:
DF["L"] = [12 if "p" in item else 0 for item in DF["NewLast"].astype(str).values]
DF.loc[:, "LastNumberHourUpdate"] = DF.loc[:, "LastNumberHour"].astype(int) + DF.L
如果我理解正确,您希望基于另一列内容向列添加值。解决这一问题的方法如下。我将使用一个发明的数据框架,使其更通用,更易于阅读
基本阵列和数据帧:
首先,使用要添加的值创建一个数组。列表理解在这里很有用,在尝试检查字符或字符串是否存在之前,请确保将列强制转换为
str
在这里,我们将有一个输出,其中包含要添加的值:
使用
loc
将其添加到数据帧中,添加到所需的列中:
用于指示我们将要访问所有行,因为我们已经为所需列中的所有行构造了一个要添加的数组检查您的输出:
如果最后一个和运算给出了一个无法连接的错误,这意味着两个加法器中的一个是str。列表不是,我们将其构造为12或0,python将其理解为数字。要解决此问题,只需将列强制转换为整数,如下所示:
考虑到如果列中有非数值,此操作可能会产生其他问题
还要记住,在代码中使用列的后续操作中,要考虑该列的这种类型更改
相关问题 更多 >
编程相关推荐