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

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


当前回答

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


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'])

其他回答

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


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'])

加载csv文件时包含日期列。我们有两种方法来制作熊猫 识别日期列,即

熊猫显式识别格式通过arg date_parser=mydateparser Pandas隐式识别agr infer_datetime_format=True的格式

一些日期列数据

01/01/18

01/02/18

这里我们不知道前两件事,可能是月,也可能是日。在这种情况下,我们要用 方法1: 显式传递格式

    mydateparser = lambda x: pd.datetime.strptime(x, "%m/%d/%y")
    df = pd.read_csv(file_name, parse_dates=['date_col_name'],
date_parser=mydateparser)

方法2:—隐式或自动识别格式

df = pd.read_csv(file_name, parse_dates=[date_col_name],infer_datetime_format=True)

不,在pandas中没有办法自动识别日期列。

Pandas在类型推断方面做得很差。它基本上把大多数列作为泛型对象类型,除非你手动绕过它。使用上面提到的parse_dates参数。

如果您想自动检测列类型,则必须使用单独的数据分析工具,例如。然后将推断的类型转换或反馈回DataFrame构造函数(例如。对于dates和from_csv,使用parse_dates参数)。

除了其他回复所说的,如果必须解析具有数十万个时间戳的非常大的文件,date_parser可能会成为一个巨大的性能瓶颈,因为它是一个每行调用一次的Python函数。您可以通过在解析CSV文件时将日期保存为文本,然后将整个列一次性转换为日期来获得相当大的性能改进:

# For a data column
df = pd.read_csv(infile, parse_dates={'mydatetime': ['date', 'time']})

df['mydatetime'] = pd.to_datetime(df['mydatetime'], exact=True, cache=True, format='%Y-%m-%d %H:%M:%S')
# For a DateTimeIndex
df = pd.read_csv(infile, parse_dates={'mydatetime': ['date', 'time']}, index_col='mydatetime')

df.index = pd.to_datetime(df.index, exact=True, cache=True, format='%Y-%m-%d %H:%M:%S')
# For a MultiIndex
df = pd.read_csv(infile, parse_dates={'mydatetime': ['date', 'time']}, index_col=['mydatetime', 'num'])

idx_mydatetime = df.index.get_level_values(0)
idx_num = df.index.get_level_values(1)
idx_mydatetime = pd.to_datetime(idx_mydatetime, exact=True, cache=True, format='%Y-%m-%d %H:%M:%S')
df.index = pd.MultiIndex.from_arrays([idx_mydatetime, idx_num])

在我的用例中,一个文件有200k行(每行一个时间戳),这将处理时间从大约一分钟缩短到不到一秒。

你可以使用参数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'])