Pandas中的Parse_dates

use*_*212 16 python datetime pandas

以下代码无法将我的日期列解析为csv文件中的日期.

data=pd.read_csv('c:/data.csv',parse_dates=True,keep_date_col = True) 
Run Code Online (Sandbox Code Playgroud)

要么

data=pd.read_csv('c:/data.csv',parse_dates=[0]) 
Run Code Online (Sandbox Code Playgroud)

数据如下

date          value 
30MAR1990    140000 
30JUN1990    30000  
30SEP1990    120000  
30DEC1990    34555
Run Code Online (Sandbox Code Playgroud)

我做错了什么?请帮忙!

谢谢.

And*_*den 36

这是一种非标准格式,因此没有被默认解析器捕获,您可以传递自己的:

In [11]: import datetime as dt

In [12]: dt.datetime.strptime('30MAR1990', '%d%b%Y')
Out[12]: datetime.datetime(1990, 3, 30, 0, 0)

In [13]: parser = lambda date: pd.datetime.strptime(date, '%d%b%Y')

In [14]: pd.read_csv(StringIO(s), parse_dates=[0], date_parser=parser)
Out[14]:
        date  value
0 1990-03-30  140000
1 1990-06-30   30000
2 1990-09-30  120000
3 1990-12-30   34555
Run Code Online (Sandbox Code Playgroud)

另一个选择是在读入字符串使用to_datetime :

df['date'] = pd.to_datetime(df['date'], format='%d%b%Y')
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,它有效。我只是发现 parse_dates 对于大文件来说真的很耗时。 (3认同)
  • @ user3576212 是的,您正在从快速 Cython 读取 csv 转移到日期时间的 python。使用 to_datetime imo 好得多。 (2认同)
  • 感谢您的好回答,但将 True 写为 [0] 很糟糕。 (2认同)
  • @Hakaishin不是True,这是要解析的日期的列索引 (2认同)

Tom*_*ger 5

您可以使用date_parserread_csv的参数

In [62]: from pandas.compat import StringIO

In [63]: s = """date,value 
30MAR1990,140000 
30JUN1990,30000  
30SEP1990,120000  
30DEC1990,34555
"""

In [64]: from pandas.compat import StringIO

In [65]: import datetime
Run Code Online (Sandbox Code Playgroud)

date_parser期望一个将在字符串数组上调用的函数。func调用datetime.datetime.strptime每个字符串。datetime有关格式代码的更多信息,请查看python 文档中的模块。

In [66]: func = lambda dates: [datetime.datetime.strptime(x, '%d%b%Y') for x in dates]

In [67]: s = """date,value 
30MAR1990,140000 
30JUN1990,30000  
30SEP1990,120000  
30DEC1990,34555
"""

In [68]: pd.read_csv(StringIO(s), parse_dates=['date'], date_parser=func)
Out[68]: 
        date  value 
0 1990-03-30  140000
1 1990-06-30   30000
2 1990-09-30  120000
3 1990-12-30   34555

[4 rows x 2 columns]
Run Code Online (Sandbox Code Playgroud)