Pandas DataFrame按行求和异常求助:DatetimeIndex数值计算错误
问题原因与解决方案
看起来你的sum(axis=1)得到错误结果,最可能的原因是你的数据列(0和1)不是数值类型(int/float),而是被解析成了其他类型(比如timedelta64时间差类型,或者object字符串类型),导致pandas无法正确计算数值求和。
从你给出的错误结果来看:第二行的0.48求和后得到0.02,而0.48 / 24 = 0.02——这强烈暗示你的列1是以小时为单位的timedelta类型,pandas在求和时自动将时间差转换为了以天为单位的数值,所以得到了看似错误的结果。
第一步:验证数据类型
先运行以下代码查看每列的数据类型:
print(df.dtypes)
如果输出里列0和列1的类型是timedelta64[ns],那就能确认问题所在;如果是object类型,说明列里可能是字符串格式的数值,没有被正确解析。
第二步:针对性解决
情况1:列是timedelta类型
如果要保留原始数值(比如小时数),可以将timedelta转换为小时数的数值,再求和:
# 将timedelta转换为小时数 df['0'] = df['0'].dt.total_seconds() / 3600 df['1'] = df['1'].dt.total_seconds() / 3600 # 执行按行求和 df['DailyTotal'] = df.sum(axis=1)
情况2:列是object(字符串)类型
如果列里是字符串格式的数值,先转换为float类型再求和:
# 转换为数值类型,无法转换的会变成NaN(和你的示例一致) df['0'] = pd.to_numeric(df['0'], errors='coerce') df['1'] = pd.to_numeric(df['1'], errors='coerce') # 按行求和 df['DailyTotal'] = df.sum(axis=1)
额外建议:明确指定求和列
为了避免不小心包含其他列(比如索引或隐藏列),可以明确指定要求和的列:
df['DailyTotal'] = df[[0, 1]].sum(axis=1)
这样应该就能得到你预期的结果了:第一行0.05 + 0.24 = 0.29,第二到第五行0.48(因为NaN会被自动忽略)。
内容的提问来源于stack exchange,提问作者boullyjj
相关产品推荐
相关产品推荐

