【问题标题】:Pandas read_csv not recognizing ISO8601 as datetime dtypePandas read_csv 未将 ISO8601 识别为 datetime dtype
【发布时间】:2015-02-01 07:36:09
【问题描述】:

目前我正在使用 pandas 将 csv 文件读入DataFrame,使用第一列作为索引。第一列是 ISO 8601 格式,所以根据read_csv 的文档,它应该被识别为日期时间:

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

但是,在查询索引 dtype 时,它​​返回 'object':

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

然后我必须手动将其转换为 datetime dtype:

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

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

有没有办法在调用read_csv()时自动将索引设置为datetime dtype?

【问题讨论】:

  • 你没有告诉它把列解析为日期时间df = pd.read_csv('data.csv', parse_dates = 0, index_col=0)
  • 是的,成功了!出于某种原因,当我阅读read_csv 的文档时,我认为parse_dates 默认为True,可能来自阅读:“如果为真-> 尝试解析索引”
  • 我一直发现read_csv 文档的这一方面是模棱两可的,可能不正确,我总是不得不传递整数索引,请注意,如果你愿意,你必须作为列表传递解析多个列,如下所示:parse_dates=[0,3,4] 和嵌套列表,如果您希望它将多个列解析为单个日期时间列:parse_dates=[[0,1]]。所以我注意到设置 parse_dates=True 不起作用所以我总是为列索引传递一个列表或单个 int
  • 是的,当我不得不合并多个列时,我曾经使用过parse_datesdate_parser。嗯,这很奇怪,parse_dates=True 似乎在我当前的设置下工作正常(python 2.7.8 x64,pandas 0.15.1)
  • 在 python 3.3.5 64 位、pandas 0.15.1 上使用你的数据对我来说仍然很奇怪

标签: python datetime pandas


【解决方案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)

【讨论】:

    【解决方案2】:

    read_csv 文档描述了 parse_dates 参数:

    parse_dates : 布尔值或整数列表或名称或列表或字典列表,默认为 False
    - 布尔值。如果 True -> 尝试解析索引。
    - 整数或名称列表。例如如果 [1, 2, 3] -> 尝试将第 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)
    

    【讨论】:

      猜你喜欢
      • 2013-05-31
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 2019-11-30
      • 2013-11-10
      相关资源
      最近更新 更多