日期时间行为TypeError:parser()缺少1个必需的位置参数:

时间:2018-02-17 12:38:21

标签: python pandas

我修改了这个

def parser(x):
    return datetime.strptime('190'+x, '%Y-%m')

因为我的月度日期是从2002年到2017年

def parser(x,y):
    return datetime.strptime('20'+x+y, '%Y-%m')

当我跑步时

s = read_csv('output.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)

终端输出显示

site-packages/pandas/io/parsers.py", line 3030, in converter
    date_parser(*date_cols), errors='ignore')
TypeError: parser() missing 1 required positional argument: 'y'

miniconda3/lib/python3.6/site-packages/pandas/io/parsers.py", line 3039, in converter
    dayfirst=dayfirst),
  File "pandas/_libs/tslibs/parsing.pyx", line 434, in pandas._libs.tslibs.parsing.try_parse_dates
  File "pandas/_libs/tslibs/parsing.pyx", line 431, in pandas._libs.tslibs.parsing.try_parse_dates
TypeError: parser() missing 1 required positional argument: 'y'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "a212.py", line 8, in <module>
    series = read_csv('output.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)

位置论证有问题。我应该改变什么? 修改

如果我尝试一个论点它不起作用

line 362, in _strptime
    (data_string, format))
ValueError: time data '202002-01-15' does not match format '%Y-%m'

数据

Date, Price 
2002-01-15,3.1
2002-02-15,2.86
2002-03-15,3.37
2002-04-15,3.8
2002-05-15,3.78
2002-06-15,3.61
2002-07-15,3.49
2002-08-15,3.42
2002-09-15,3.71
2002-10-15,4.19
2002-11-15,4.35

1 个答案:

答案 0 :(得分:1)

The documentation for pandas.read_csv个州:

  

date_parser :功能,默认无

     

用于将字符串列序列转换为   日期时间实例数组。默认使用dateutil.parser.parser   做转换。熊猫会尝试将date_parser调用为三个   不同的方式,如果发生异常则前进到下一个:1)通过   一个或多个数组(由parse_dates定义)作为参数; 2)   连接(行方式)来自定义的列的字符串值   parse_dates成一个数组并传递; 3)调用date_parser   每一行使用一个或多个字符串(对应于   parse_dates定义的列作为参数。

当数组(在您的情况下为第一列)作为参数传递时,您的parser函数将应用于列中的每个值。

换句话说,只会将一个参数传递给您的函数。但是你的函数需要2个参数(xy)。

您需要准确弄清楚要应用于列中字符串的逻辑,并将其应用于f(x)形式。

根据您提供的数据,这应该足够了:

from datetime import datetime

def parser(x):
    return datetime.strptime(x, '%Y-%m-%d')

s = pd.Series(['2002-01-15', '2002-02-15', '2002-03-15'])
s.apply(parser)

# 0   2002-01-15
# 1   2002-02-15
# 2   2002-03-15
# dtype: datetime64[ns]