【问题标题】:python pandas parse_dates np.array vs listpython pandas parse_dates np.array vs list
【发布时间】:2019-09-28 11:22:46
【问题描述】:

好的,所以我对下面的文章很迷茫。我有 .csv 文件,我想用 Pandas 将其解析为数据帧。 .csv 中的某些列应该包含日期,所以我想用pd.read_csv 中的parse_dates 标志来攻击它们。因此,我采用以下方式进行此操作,首先定义我的“模式数据框”,指示我期望在文件中为其各自列的数据类型:

import pandas as pd
import numpy as np

df_schema = pd.DataFrame(
    index=pd.RangeIndex(start=0, stop=5, step=1), 
    data={'dtype_expected':[
                np.dtype('datetime64[ns]'),
                np.dtype('datetime64[ns]'),
                np.dtype('datetime64[ns]'),
                np.dtype('float64'),
                np.dtype('datetime64[ns]')
                ]
        }
)

然后“计算”我想解析为日期的列索引:

parse_dates = df_schema[
                df_schema['dtype_expected'] == np.dtype('datetime64[ns]')
              ].index.values

所以这导致type(parse_dates) 成为numpy.ndarray(在上面的例子中是array([0, 1, 2, 4], dtype=int64)),因为我知道pd.read_csv 会期望parse_dates 的整数列表,所以我用@987654330 包装它@构造函数如下:

df = pd.read_csv(
    file_path, 
    error_bad_lines=True, 
    sep = ';',
    decimal=',',
    parse_dates=list(parse_dates)
)

但他的崩溃是KeyError: 0

(!!!) 有趣的是,如果我输入代码parse_dates = [0,1,2,4](即,我不计算它,只是简单地输入值),那么上面的 sn-p 就可以了像一个魅力!对这个很困惑。此外,这表明问题与数据无关。

【问题讨论】:

  • 我之前遇到过这个错误,但没有找到完全令人满意的解决方案。我发现有一条记录不会强制约会。我解决它的方法是将 csv 作为常规文件导入,然后使用 df['my_date'] = pd.to_datetime(df['my_date'],errors = 'coerce') 然后手动查看返回 N/A 的日期。幸运的是,在我的数据集中填充这些内容很容易。

标签: python arrays pandas list csv


【解决方案1】:

我不知道为什么,但是将上面的 sn-ps 更改为:

parse_dates = df_schema[
                df_schema['dtype_expected'] == np.dtype('datetime64[ns]')
              ].index.tolist()

而不是values,然后:

df = pd.read_csv(
    file_path, 
    error_bad_lines=True, 
    sep = ';',
    decimal=',',
    parse_dates=parse_dates
)

解决了。真的不能说为什么list(index.values)(原始代码)和index.tolist()(更改后的代码)之间会有区别,但显然有一些区别。

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多