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

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)。


当前回答

也许自从@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]

其他回答

当将两个列合并为单个datetime列时,接受的答案将生成一个错误(pandas版本0.20.3),因为列分别发送给date_parser函数。

以下工作:

def dateparse(d,t):
    dt = d + " " + t
    return pd.datetime.strptime(dt, '%d/%m/%Y %H:%M:%S')

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

分别以日期和时间格式读取现有字符串列


pd.read_csv('CGMData.csv', parse_dates=['Date', 'Time'])

结果列



连接日期和时间的字符串列,并添加datetype对象的新列-删除原始列

如果要重命名新列名,则将字典作为 如下面的例子所示,新的列名将是键名, 如果作为列的列表传递,新的列名将是列表中传递的列名的组合,以_例如Date_Time分隔


    # parse_dates={'given_name': ['Date', 'Time']}    
    pd.read_csv("InsulinData.csv",low_memory=False, 
                                 parse_dates=[['Date', 'Time']])

    pd.read_csv("InsulinData.csv",low_memory=False, 
                                 parse_dates={'date_time': ['Date', 'Time']})

连接日期和时间的字符串列,并添加datetype对象的新列和保留原始列


pd.read_csv("InsulinData.csv",low_memory=False, 
          parse_dates=[['Date', 'Time']], keep_date_col=True)

想要更改从csv读取的日期和时间的格式


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

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

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

你可以在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

是的——根据熊猫的说法。read_csv文档:

注意:对于iso8601格式的日期存在快速路径。

因此,如果您的csv有一个名为datetime的列,日期看起来像2013-01-01T01:01,例如,运行这个将使pandas(我在v0.19.2)自动获取日期和时间:

Df = pd.read_csv('test.csv', parse_dates=['datetime'])

请注意,您需要显式地传递parse_dates,否则它无法工作。

验证:

df.dtypes

您应该看到该列的数据类型是datetime64[ns]