首页 > 解决方案 > 是否可以在 pandas read_csv 中向 lambda 函数传递一个额外的参数

问题描述

我经常使用read_csv()函数 frompandas和 lambdadate_parser函数的选项退出,我想知道是否可以将参数传递给这个 labda 函数。

这是我设置 format_string 的最小示例:

import pandas as pd

def date_parser_1(value, format_string='%Y.%m.%d %H:%M:%S'):
    return pd.to_datetime(value, format=format_string)

df = pd.read_csv(file,
             parse_dates=[1], 
             date_parser=date_parser_1 #args('%Y-%m-%d %H:%M:%S')                    
            )
print(df)

我知道,那pandas有一个infer_datetime_format标志,但这个问题只是在寻找一个自定义的date_parser.

标签: pythonpandas

解决方案


欢迎来到偏函数的魔力。

def outer(outer_arg):
    def inner(inner_arg):
        return outer_arg * inner_arg    
    return inner

fn = outer(5)
print(fn(3))

基本上,您在函数内部定义函数并将该内部函数作为结果返回。在这种情况下,我调用outer(5)这意味着我现在分配了一个函数fn,我可以调用很多次,每次它都会执行内部函数,但outer_arg在闭包中。

所以在你的情况下:

def dp1_wrapper(format_string):
    def date_parser_1(value):
        return pd.to_datetime(value, format=format_string)
    return date_parser_1


df = pd.read_csv(file,
    parse_dates=[1],
    date_parser=dp1_wrapper('%Y.%m.%d %H:%M:%S')
)

一旦你知道它是如何工作的,就会有一个快捷实用程序:

from functools import partial 

df = pd.read_csv(file,
    parse_dates=[1],
    date_parser=partial(date_parser_1, format='%Y.%m.%d %H:%M:%S')
)

推荐阅读