在解决这个错误时,有一些函数可以解决这个问题,ufunc ‘subtract’ 无法使用类型为 dtype (‘<M8 [ns]’) 和 dtype (‘float64’) 的操作数,或者有其他方法可以让程序运行并提供以下数据:
import pandas as pd
maint = pd.read_csv('D:/IC/teste_disseracao/banco_de_dados_PdM/PdM_maint.csv')
telemetry = pd.read_csv('D:/IC/teste_disseracao/banco_de_dados_PdM/PdM_telemetry.csv')
telemetry['datetime'] = pd.to_datetime(telemetry['datetime'], format="%Y-%m-%d %H:%M:%S")
maint['datetime'] = pd.to_datetime(maint['datetime'], format="%Y-%m-%d %H:%M:%S")
import numpy as np
# 将错误转换为列
comp_rep = pd.get_dummies(maint)
comp_rep.columns = ['datetime', 'machineID', 'comp1', 'comp2', 'comp3', 'comp4']
# 合并特定机器在特定时间的错误
comp_rep = comp_rep.groupby(['machineID', 'datetime']).sum().reset_index()
# 添加没有组件更换的时间点
comp_rep = telemetry[['datetime', 'machineID']].merge(comp_rep,
on=['datetime', 'machineID'],
how='outer').fillna(0).sort_values(by=['machineID', 'datetime'])
components = ['comp1', 'comp2', 'comp3', 'comp4']
for comp in components:
# 将指示器转换为组件最近更改的日期
comp_rep.loc[comp_rep[comp] < 1, comp] = None
comp_rep.loc[-comp_rep[comp].isnull(), comp] = comp_rep.loc[-comp_rep[comp].isnull(), 'datetime']
# 前向填充组件最近更改的日期
comp_rep[comp] = comp_rep[comp].fillna(method='ffill')
# 移除2014年的数据(可能包含NaN或未来组件更改日期)
comp_rep = comp_rep.loc[comp_rep['datetime'] > pd.to_datetime('2015-01-01')]
for comp in components:
comp_rep[comp] = (comp_rep['datetime'] - comp_rep[comp]) / np.timedelta64(1, 'D')
print(comp_rep.head())
回答:
尝试这个方法,对我来说有效:
for comp in components:
comp_rep[comp] = (comp_rep["datetime"] - pd.to_datetime(comp_rep[comp])) / np.timedelta64(1, "D")
comp_rep.head()