仅在数据框列中添加到负数天

问题描述

我有一个数据框,我在其中获得了两个不同小时之间的差异列(在下面的示例中):

array([[-3.68962631e+01],[ 4.36777472e-01],[ 9.44449380e-03],[-1.07348785e-01],[ 6.44962370e-01],[-3.94082872e-06],[-3.78797273e-03],[-4.20847952e-01],[-4.34020907e-01]],dtype=float32)

这些值被标记timedelta类型。那么,如何只为那些负值添加一天(使差值变为正值)?我试图做:

    difference 
    00:30:15 
    00:15:00
    -1 days +02:27:00
    -1 days +00:41:00

(引号标记为零,因为否则不接受,不知道为什么)

输出

TypeError:“ DataFrame”对象是可变的,因此不能被散列

然后我尝试:

mask=df[df["difference"]<"0"]
df[mask,"difference"]=df["difference"] + pd.timedelta(days=1)

输出

TypeError:dtype = timedelta64 [ns]与int之间的比较无效

所以,我不知道还能做什么。我在这里回顾了很多问题,但到目前为止,没有一个问题对我有帮助。任何想法都欢迎。

解决方法

尝试一下:

df.loc[df['difference'] < '0','difference'] = df["difference"] + pd.Timedelta(days=1)
,

您快到了。 mask应该是布尔数组,而不是数据框:

mask=df["difference"]<"0" # << Note the change
df.loc[mask,"difference"]=df["difference"] + pd.Timedelta(days=1)
print(df)

输出:

  difference
0   00:30:15
1   00:15:00
2   02:27:00
3   00:41:00
,

可以使用dtype找出列中值的类型吗?如果它们不是日期类型,则比较时会遇到问题。

,

您的第二次尝试几乎成功了……但是,如例外情况所述,您无法比较pd.Timedelta < int,在这种情况下,0是整数。

您可以使用

对其进行修复
df.loc[df["difference"] < pd.Timedelta(0),"difference"]=df["difference"] + pd.Timedelta(days=1)