我有以下数据集: https://i.imgur.com/Ufk7Tvz.jpg
我想创建一个新列,该列是time_exit和time_entry之间的减法。 但是,当我尝试代码时:
df[['tempo']] = df['time_exit'] - df['time_entry']
结果是:TypeError:-:'str'和'str'的不受支持的操作数类型
如果我这样做:
df[['tempo']] = df[['time_exit']] - df[['time_entry']]
结果是:ValueError:列的长度必须与键的长度相同。
但是对两者进行描述时,它们具有相同的计数,即381185。
我迷路了。
答案 0 :(得分:1)
看着第一个错误,您的列的数据类型错误;您正在尝试从另一个减去一个字符串。因此,您应该转换这些列:
df['time_exit'] = pd.to_datetime(df['time_exit'])
df['time_entry'] = pd.to_datetime(df['time_entry'])
然后
df['tempo'] = df['time_exit'] - df['time_entry']
应该可以解决问题。
您的第二种方法失败了,因为df[['time_exit']]
和df[['time_entry']]
返回了DataFrames,而不是Series。
减去两个DataFrames,每个DataFrames分别具有一列(并且这些列具有不同的名称),将返回第三个数据框,其中包含两列,并用nan填充,不能将其分配给单个列。
答案 1 :(得分:0)
将apply
与Timedelta
一起使用:
#sample data
df = pd.DataFrame({'start': ['07:15:00', '08:00:00'], 'end':['08:15:00', '10:00:00']})
# apply with pd.Timedelta
df['diff'] = df['end'].apply(pd.Timedelta) - df['start'].apply(pd.Timedelta)
start end diff
0 07:15:00 08:15:00 01:00:00
1 08:00:00 10:00:00 02:00:00
答案 2 :(得分:0)
我建议先指定当前时间数据的格式,
df['time_exit'] = pd.to_datetime(df['time_exit'] , errors='coerce', format='%d/%m/%Y %H:%M:%S', infer_datetime_format=True)
df['time_entry'] = pd.to_datetime(df['time_entry'] , errors='coerce', format='%d/%m/%Y %H:%M:%S', infer_datetime_format=True)
在此之后:
df[['tempo']] = df['time_exit'] - df['time_entry']
如果您只需要计算天数:
df[['tempo']] = (df['time_exit'] - df['time_entry']).dt.days