我正在尝试使用xlwings在python / Excel中编写UDF。我在以下格式的电子表格中将时间序列数据分为三列:
Date Hour Value
01/11/2017 1 43.1
01/11/2017 2 41.8
01/11/2017 3 38.6
01/11/2017 4 38.6
01/11/2017 5 38.6
我希望能够选择此范围,使用pandas groupby函数以多种方式(月平均值等)操作它,然后将结果输出回新的电子表格。这段代码适合我:
@xw.sub
def get_df_from_range():
"""get's df"""
#make the current selection a dataframe
wb = xw.Book.caller()
df = wb.selection.options(pd.DataFrame, index = False).value
#simple check: add a sheet and print the dataframe
sht = wb.sheets.add()
sht.range('A1').options(index = False).value = df
但是,一旦我在打印之前尝试对数据帧进行任何操作,我就会收到错误消息。例如:
@xw.sub
def get_df_from_range():
"""get's df"""
#make the current selection a dataframe
wb = xw.Book.caller()
df = wb.selection.options(pd.DataFrame, index = False).value
#simple manipulation task
df['Date'] = pd.to_datetime(df['Date'], format = '%d/%m/%Y')
#add a sheet and print the dataframe
sht = wb.sheets.add()
sht.range('A1').options(index = False).value = df
这会显示错误消息:
Run-time error '2147467259 (80004005)':
AttributeError: 'tuple' object has no attribute 'lower'
if value.lower() in _unit_map:
File
"C:\User\AppData\Local\Programs\Python\Python36-32
line 441, in f
unit = {k: f(k) for k in arg.keys()}
我认为我可以通过创建相同的代码来更好地调试它,但不能作为UDF;只需在Spyder中编写代码并连接到电子表格 - 所以我会在我的变量资源管理器中使用df变量。但是当我写几乎完全相同的代码时,它没有给我一个错误信息:
wb = xw.Book("my_spreadsheet.xlsm")
df = wb.selection.options(pd.DataFrame, index = False).value
df['Date'] = pd.to_datetime(df['Date'], format = '%d/%m/%Y')
我真的很担心为什么会这样。有人可以帮忙吗?
我应该注意,我知道xlwings会自动将Excel日期作为datetime64 [ns]格式读取。这不是我想要做的。我想用数据帧做其他事情(例如,将它连接到另一个数据帧),当我尝试使用UDF方法时,所有其他任务也会失败,但是工作O.K.当我刚从Spyder连接到电子表格时。我希望如果我能得到那个简单的操作任务"工作,然后所有其他任务也可以工作。