我修改了这个
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
答案 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个参数(x
,y
)。
您需要准确弄清楚要应用于列中字符串的逻辑,并将其应用于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]