簡體   English   中英

為另存為csv的pandas數據框保存數據類型

[英]Saving data types for a pandas dataframe saved as a csv

我希望能夠為我的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)

但這不起作用-無法恢復日期時間...

如果我顯式創建字典,它也不起作用

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

首先, 如果您不必將結果另存為csv文件,則可以使用to_pickleto_parquet類的pandas方法來保留列數據類型。

其次, 如果你想保存結果CSV格式,並保留其數據類型,那么你可以使用parse_dates的說法read_csv 為此,您可以將其更新為:

    # 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))

我將回答對我有用的東西。 它可能不是最漂亮的解決方案,但它可以工作。 還可以幫助某人

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM