【问题标题】:Saving data types for a pandas dataframe saved as a csv保存保存为 csv 的 pandas 数据帧的数据类型
【发布时间】:2020-01-09 18:07:57
【问题描述】:

我希望能够为我的 df 保存 dtypes,当我下次阅读 csv 时,我想证明一个 dtypes 数组。

我尝试了以下方法:

types_dic = df.dtypes.to_dict()
np.save("dtypes.npy", types_dic, allow_pickle=True)
dtyp = np.load("dtypes.npy", allow_pickle=True)
df2 = pd.read_csv(join(folder_no_extension, file), dtype=dtyp)

但是不行--datetime时间没有恢复...

如果我明确创建字典,它也不起作用

types_dic = {}
for t in df.dtypes:
   types_dic[t] = str(df.dtypes[t])



df.dtypes

BN                            object
School_Year           datetime64[ns]
Start_Date            datetime64[ns]
Overall_Rating                object
Indicator_1.1                 object
Indicator_1.2                 object
Indicator_1.3                 object
Indicator_1.4                 object

df2.dtypes

BN                    object
School_Year           object
Start_Date            object
Overall_Rating        object
Indicator_1.1         object
Indicator_1.2         object
Indicator_1.3         object
Indicator_1.4         object

【问题讨论】:

  • 你见过这个问题吗? stackoverflow.com/questions/20095983/…
  • load 之后查看dtyp。它可能是一个包含字典的数组,而不是字典本身。如果您想在没有该数组包装器的情况下保存字典,请使用 pickle

标签: python pandas csv datetime


【解决方案1】:

首先,如果您不必将结果保存为 csv 文件,您可以改用诸如 to_pickleto_parquet 之类的 pandas 方法来保留列数据类型。

其次,如果您确实想将结果保存为 csv 格式并保留它们的数据类型,请使用 you can use read_csvparse_dates 参数。为此,您可以更新为:

    # Save non-date dtypes
    non_date_dict = df.dtypes[df.dtypes != '<M8[ns]'].to_dict()
    np.save("non_date_dict.npy", non_date_dict, allow_pickle=True)
    non_date_dict2 = np.load("non_date_dict.npy", allow_pickle=True)
    # Save date dtypes
    date_col_list = list(df.dtypes[df.dtypes == '<M8[ns]'].index)
    np.save("date_col_list.npy", date_col_list, allow_pickle=True)
    date_col_list2 = np.load("date_col_list.npy", allow_pickle=True)
    # Load
    df2 = pd.read_csv('pandas_dtypes.csv',
                      dtype=non_date_dict2,
                      parse_dates=list(date_col_list2))

【讨论】:

    【解决方案2】:

    我会回答对我有用的东西。这可能不是最漂亮的解决方案,但它确实有效。还不如帮助别人

    import json
    ...
    dic = {}
    for t in df.dtypes.to_dict():
        dic[t] = str(df.dtypes[t])
    
    with open('dtypes.json', 'w') as fp:
        json.dump(dic, fp)
    
    with open('dtypes.json', 'r') as fp:
        dtyp = json.load(fp)
    
    dic = {}
    dates = []
    
    for t in dtyp:
        if "object" in str(dtyp[t]):
            atype = np.str
        elif "float" in str(dtyp[t]):
            atype = np.float_
        elif "datetime" in str(dtyp[t]):
            atype = np.str
            dates.append(t)
        else:
            atype = np.int_
        dic[t] = atype
    
    df2 = pd.read_csv(path, dtype=dic, parse_dates=dates)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      相关资源
      最近更新 更多