parse_dates 不适用于默认日期时间格式

Posted

技术标签:

【中文标题】parse_dates 不适用于默认日期时间格式【英文标题】:parse_dates doesn't work with default datetime format 【发布时间】:2016-04-08 20:30:04 【问题描述】:

我正在将日期时间格式的数据导出到 csv。当我将其导入回来时,我需要能够在没有任何列名或列号引用的情况下以日期形式读取数据。

看起来 Pandas read_csv 具有自动将日期解析为日期时间格式的选项,但它似乎在这里不起作用。

# Create date data
df_list = [['2014-01-01','2014-02-01'],['2015-01-01','2015-02-01']]
df = pd.DataFrame(df_list,columns=['date1','date2'])

# Convert to datetime format
df['date1'] = pd.to_datetime(df['date1']) 

# Export to csv
df.to_csv('_csv_file.csv',index=False)

# Read in the data and parse dates
in_df = pd.read_csv('_csv_file.csv',parse_dates=True,infer_datetime_format=True)

# Dates are not of correct type
print df.dtypes
print 
print in_df.dtypes

Out [1]:

date1    datetime64[ns]
date2            object
dtype: object

date1    object
date2    object
dtype: object

有没有什么方法可以在导入时自动解析日期列而不明确识别列名或位置?

【问题讨论】:

您必须明确告诉 pandas 将哪些列视为日期时间,这是因为可以将数值解析为纪元时间或将 20150110 等值解析为字符串以及 2015-01-10 【参考方案1】:

我觉得你可以把read_csv的参数parse_dates中的True改成['date1'],因为True的意思是解析index['date1']解析列date1

# Read in the data and parse dates
in_df = pd.read_csv('_csv_file.csv', parse_dates=['date1'], infer_datetime_format=True )

#second solution
#instead column name - number of column
#in_df = pd.read_csv('_csv_file.csv',parse_dates=[0], infer_datetime_format=True )

# Dates are not of correct type
print df.dtypes
print 
print in_df.dtypes

date1    datetime64[ns]
date2            object
dtype: object

date1    datetime64[ns]
date2            object
dtype: object

Docs:

parse_dates:布尔值,整数或名称列表,列表或字典列表,默认为 False

如果为真 -> 尝试解析索引。如果 [1, 2, 3] -> 尝试将第 1、2、3 列分别解析为单独的日期列。如果 [[1, 3]] -> 合并第 1 列和第 3 列并解析为单个日期列。 ‘foo’ : [1, 3] -> 将第 1、3 列解析为日期并调用结果 ‘foo’ iso8601 格式的日期存在快速路径。

infer_datetime_format:布尔值,默认为 False

如果为某个列启用了 True 和 parse_dates,则尝试推断日期时间格式以加快处理速度

如果您将列 date1 设置为索引,它会起作用:

# Read in the data and parse dates
in_df = pd.read_csv('_csv_file.csv', parse_dates=True, infer_datetime_format=True, 
                    index_col='date1' )

# Dates are not of correct type

print 
print in_df.dtypes
print in_df.index

date2    object
dtype: object
DatetimeIndex(['2014-01-01', '2015-01-01'], dtype='datetime64[ns]', name=u'date1', freq=None)

编辑:

如果要将所有列解析为datetime,可以通过参数parse_dates指定所有列的列数:

in_df = pd.read_csv('_csv_file.csv', parse_dates=[0, 1, 2, 3])

但可能会出现错误 - 一些 integers 可以解析为 datetimes,例如:

print df
print df.dtypes

       date1       date2  int1      int2
0 2014-01-01  2014-02-01  2000  20111230
1 2015-01-01  2015-02-01  2014  20151230
date1    datetime64[ns]
date2            object
int1              int64
int2              int64
dtype: object

print 
print in_df
print in_df.dtypes

       date1      date2       int1       int2
0 2014-01-01 2014-02-01 2000-01-01 2011-12-30
1 2015-01-01 2015-02-01 2014-01-01 2015-12-30
date1    datetime64[ns]
date2    datetime64[ns]
int1     datetime64[ns]
int2     datetime64[ns]
dtype: object

【讨论】:

这是一个很好的解释,所以如果没有其他问题,我会接受它,但问题之一是我不会提前知道哪些列将是日期,所以我希望找到一些东西来自动检测和解析日期列。 嗯,有些列是numeric,有些是datetime 类型吗?还是所有列都是stringdatetime 类型?

以上是关于parse_dates 不适用于默认日期时间格式的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 日期格式不适用于存储过程

SQL 不适用于大样本

标准 SQL (BigQuery) 中整数 YYYYMMDD 的日期

引导日期选择器不适用于 Webpack

Jquery Datatable - 日期排序不适用于月份(相对于日期的月份)

表格排序不适用于 ie9、firefox 中的日期