在 xlsxwriter 中定义系列时出现 TypeError 'buffer size mismatch' 错误

TypeError 'buffer size mismatch' error when defining a series in xlsxwriter

我正在尝试使用 xlsxwriter 和 pandas 数据以编程方式在 xlsx 文件中创建图表。 写入单元格是成功的,但是当我尝试为散点图定义数据系列时,我得到一个 TypeError 'buffer size mismatch' 并且我相当确定我定义的范围是可以接受的。

示例代码:

headers = DataFrame([[-0.398,2],[-0.201,2],[-0.001,20]],columns=['Bias','Sensitivity'])
dfs = [DataFrame([[3998.28253,2.056],[3997.31816,1.978],[3996.35379,1.932],[3995.38942,1.746],[3994.42504,1.478]]),
       DataFrame([[3998.28253,2.056],[3997.31816,1.978],[3996.35379,1.932],[3995.38942,1.746],[3994.42504,1.478]]),
       DataFrame([[3998.28253,2.056],[3997.31816,1.978],[3996.35379,1.932],[3995.38942,1.746],[3994.42504,1.478]])]
       # Repeated DataFrames here for convenience

outxls = os.path.join(os.path.dirname(toplevelname),p+'.xlsx')

workbook = xlsxwriter.Workbook(outxls)
worksheet = workbook.add_worksheet('Sheet1')

worksheet.write(0, 0, 'Bias')
worksheet.write(1, 0, 'Sensitivity')

chart = workbook.add_chart({'type': 'scatter'})
for i, h in enumerate(headers.index):
    worksheet.write_number(0, 2*i+2, headers['Bias'][h], )
    worksheet.write_number(1, 2*i+2, headers['Sensitivity'][h])
    for r, row in dfs[h].iterrows():
        for c, col in enumerate(row):
            worksheet.write_number(r+2, 2*i+c+1, row[c])

    l = len(dfs[h])
    chart.add_series({
            'name': headers['Bias'][h],
            'categories': ['Sheet1', 3, 1, l, 1],
            'values': ['Sheet1', 3, 2, l, 2],
        })
worksheet.insert_chart('B3', chart)

workbook.close()

完整的错误信息:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-56283fee8773> in <module>()
     52                 'name': headers['Bias'][h],
     53                 'categories': ['Sheet1', 3, 1, l, 1],
---> 54                 'values': ['Sheet1', 3, 2, l, 2],
     55             })
     56     worksheet.insert_chart('B3', chart)

/Users/megablanc/Library/Python/2.7/lib/python/site-packages/xlsxwriter/chart.pyc in add_series(self, options)
    134         # Switch name and name_formula parameters if required.
    135         name, name_formula = self._process_names(options.get('name'),
--> 136                                                  options.get('name_formula'))
    137 
    138         # Get an id for the data equivalent to the range formula.

/Users/megablanc/Library/Python/2.7/lib/python/site-packages/xlsxwriter/chart.pyc in _process_names(self, name, name_formula)
    788                 name_formula = quote_sheetname(name[0]) + '!' + cell
    789                 name = ''
--> 790             elif re.match(r'^=?[^!]+!$?[A-Z]+$?[0-9]+', name):
    791                 # Name looks like a formula, use it to set name_formula.
    792                 name_formula = name

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.pyc in match(pattern, string, flags)
    135     """Try to apply the pattern at the start of the string, returning
    136     a match object, or None if no match was found."""
--> 137     return _compile(pattern, flags).match(string)
    138 
    139 def search(pattern, string, flags=0):

TypeError: buffer size mismatch

问题是 nameheaders['Bias'][h] 不是字符串,在传递给函数时引发 TypeError。

由于数据类型是 numpy.float64 会引发不寻常的 buffer size mismatch 错误,因此该错误比应有的更令人困惑。

函数参数分布在多行的事实也使问题看起来像是 values 参数而不是 name 参数。