xlwings excel选择数据框 - 日期列

时间:2017-12-16 18:56:11

标签: pandas datetime xlwings

我正在尝试使用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连接到电子表格时。我希望如果我能得到那个简单的操作任务"工作,然后所有其他任务也可以工作。

0 个答案:

没有答案