今天,我非常惊讶地发现,当从数据文件读取数据时(例如),熊猫能够识别值的类型:

df = pandas.read_csv('test.dat', delimiter=r"\s+", names=['col1','col2','col3'])

例如,可以这样检查:

for i, r in df.iterrows():
    print type(r['col1']), type(r['col2']), type(r['col3'])

特别是整数、浮点数和字符串被正确识别。但是,我有一列的日期格式如下:2013-6-4。这些日期被识别为字符串(而不是python date-objects)。


当前回答

你可以在pandas.read_csv()的文档中使用pandas.to_datetime():

如果列或索引包含不可解析的日期,则整个列 或index将作为对象数据类型原封不动地返回。为 非标准的日期时间解析,使用pd。pd.read_csv后的To_datetime。

演示:

>>> D = {'date': '2013-6-4'}
>>> df = pd.DataFrame(D, index=[0])
>>> df
       date
0  2013-6-4
>>> df.dtypes
date    object
dtype: object
>>> df['date'] = pd.to_datetime(df.date, format='%Y-%m-%d')
>>> df
        date
0 2013-06-04
>>> df.dtypes
date    datetime64[ns]
dtype: object

其他回答

Pandas read_csv方法非常适合解析日期。完整的文档请访问http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html

你甚至可以在不同的列中有不同的日期部分,并传递参数:

parse_dates : boolean, list of ints or names, list of lists, or dict
If True -> try parsing the index. If [1, 2, 3] -> try parsing columns 1, 2, 3 each as a
separate date column. If [[1, 3]] -> combine columns 1 and 3 and parse as a single date
column. {‘foo’ : [1, 3]} -> parse columns 1, 3 as date and call result ‘foo’

The default sensing of dates works great, but it seems to be biased towards north american Date formats. If you live elsewhere you might occasionally be caught by the results. As far as I can remember 1/6/2000 means 6 January in the USA as opposed to 1 Jun where I live. It is smart enough to swing them around if dates like 23/6/2000 are used. Probably safer to stay with YYYYMMDD variations of date though. Apologies to pandas developers,here but i have not tested it with local dates recently.

可以使用date_parser参数传递一个函数来转换格式。

date_parser : function
Function to use for converting a sequence of string columns to an array of datetime
instances. The default uses dateutil.parser.parser to do the conversion.

也许自从@Rutger回答之后,pandas接口已经改变了,但在我使用的版本(0.15.2)中,date_parser函数接收的是日期列表,而不是单个值。在这种情况下,他的代码应该像这样更新:

from datetime import datetime
import pandas as pd

dateparse = lambda dates: [datetime.strptime(d, '%Y-%m-%d %H:%M:%S') for d in dates]
    
df = pd.read_csv('test.dat', parse_dates=['datetime'], date_parser=dateparse)

由于最初的提问者说他想要日期,而日期是2013-6-4格式,dateparse函数应该是:

dateparse = lambda dates: [datetime.strptime(d, '%Y-%m-%d').date() for d in dates]

你应该在读取时添加parse_dates=True,或者parse_dates=['列名'],这通常足以神奇地解析它。但是总有一些奇怪的格式需要手动定义。在这种情况下,还可以添加日期解析器函数,这是最灵活的方法。

假设你的字符串有一个列'datetime',那么:

from datetime import datetime
dateparse = lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M:%S')

df = pd.read_csv(infile, parse_dates=['datetime'], date_parser=dateparse)

通过这种方式,你甚至可以将多个列合并到一个datetime列中,这将'date'和'time'列合并到一个'datetime'列中:

dateparse = lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M:%S')

df = pd.read_csv(infile, parse_dates={'datetime': ['date', 'time']}, date_parser=dateparse)

你可以在本页找到strptime和strftime的指令(即用于不同格式的字母)。

你可以使用参数date_parser和一个函数来将一个字符串列序列转换为一个datetime实例数组:

parser = lambda x: pd.to_datetime(x, format='%Y-%m-%d %H:%M:%S')
pd.read_csv('path', date_parser=parser, parse_dates=['date_col1', 'date_col2'])

是的,这段代码工作起来很轻松。这里索引0指的是日期列的索引。

df = pd.read_csv(filepath, parse_dates=[0], infer_datetime_format = True)