2014-12-03 88 views
4

目前我正在使用熊猫来读取一个csv文件到DataFrame,使用第一列作为索引。第一列是在ISO 8601格式,所以根据用于read_csv的文档,但应认识为datetime:熊猫read_csv不识别ISO8601作为日期时间dtype

In [1]: import pandas as pd 

In [2]: df = pd.read_csv('data.csv', index_col=0) 

In [3]: print df.head() 
         U  V  Z Ubar Udir 
2014-11-01 00:00:00 0.73 -0.81 0.46 1.0904 317.97 
2014-11-01 01:00:00 1.26 -1.50 0.32 1.9590 319.97 
2014-11-01 02:00:00 1.50 -1.80 0.13 2.3431 320.19 
2014-11-01 03:00:00 1.39 -1.65 0.03 2.1575 319.89 
2014-11-01 04:00:00 0.94 -1.08 -0.03 1.4318 318.96 

然而,查询索引D型细胞时,它返回“对象”:

In [4]: print df.index.dtype 
object 

我那么必须手动将其转换为datetime D型:

In [5]: df.index = pd.to_datetime(df.index) 

In [6]: print df.index.dtype 
datetime64[ns] 

有什么办法可以自动调用有当设置日期时间D型指数?

+6

你不告诉它解析列日期时间'DF = pd.read_csv( 'data.csv',parse_dates = 0,index_col = 0)' – EdChum 2014-12-03 16:32:46

+0

是的,这是诀窍!出于某种原因,当我阅读'read_csv'的文档时,我认为'parse_dates'默认为'True',可能来自阅读:“If True - >尝试解析索引” – 2014-12-04 08:43:53

+0

我一直发现'read_csv'的这个方面docs是不明确的,可能是不正确的,我总是必须通过整数索引,注意如果你想解析多列,像这样:'parse_dates = [0,3,4]'和嵌套列出您是否希望它将多个列解析为单个日期时间col:'parse_dates = [[0,1]]'。所以我注意到,设置'parse_dates = True'不起作用,所以我总是通过一个列表或单个int列索引 – EdChum 2014-12-04 09:02:30

回答

1

read_csv文档描述parse_dates参数:

parse_dates:布尔或整数或名或目录的列表列表或字典,默认为False
- 布尔值。如果为True - >尝试解析索引。
- 整数或名称列表。例如如果[1,2,3] - >尝试解析每个列作为单独的日期列。
- 列表的列表。例如如果[[1,3]] - >将第1列和第3列组合起来并将其解析为 单个日期列。
- 字典,例如{'foo':[1,3]} - >将列1,3解析为日期和调用结果'foo'
注意:iso8601格式的日期存在快速路径。

既然要分析指标可以使用:

import pandas as pd 
df = pd.read_csv('data.csv', index_col=0, parse_dates=True) 
+0

这是正确的答案;然而,在提出原始问题时,[pandas 0.15.1]中的read_csv文档(http://pandas.pydata.org/pandas-docs/version/0.15.1/generated/pandas.read_csv .html#pandas.read_csv)没有指定'parse_dates'的默认值:) – 2017-02-10 12:46:15

1

我刚刚在csv文件中添加了第一列的列名。

    Date  U  V  Z Ubar Udir 
0 2014-11-01 00:00:00 0.73 -0.81 0.46 1.0904 317.97 
1 2014-11-01 01:00:00 1.26 -1.50 0.32 1.9590 319.97 
2 2014-11-01 02:00:00 1.50 -1.80 0.13 2.3431 320.19 
3 2014-11-01 03:00:00 1.39 -1.65 0.03 2.1575 319.89 
4 2014-11-01 04:00:00 0.94 -1.08 -0.03 1.4318 318.96 

df = pd.read_csv(input_file) 
df.index = pd.to_datetime(df['Date'], format='%Y-%m-%d %H:%M:%S') 

如果你要删除的日期栏,您可以使用

df = df.drop('Date', 1) 
+0

谢谢,但我已经在我的问题中表明,我可以手动改变索引dtype使用'pd.to_datetime()'。 – 2014-12-04 08:44:54