在保留数据类型的同时导出熊猫数据框的格式是什么?不是 CSV;Sqlite?镶木地板?

Pyt*_*ous 5 python pandas parquet feather

我的工作流程通常涉及将一些数据(通常来自 CSV 文件)加载到 Pandas 数据框中,对其进行清理,定义每列的正确数据类型,然后将其导出到 SQL 服务器。

对于那些SQL 服务器不可用的情况,有什么好的替代方法可以存储已清理的数据和每列的数据类型的显式定义?

  • 我测试过的唯一真正的解决方案是导出到一个 sqlite .db 文件,使用这里的答案来确保日期被读取为日期。
  • 如何羽毛,HDF5,实木复合地板?Pandas支持它们,但我对这些格式知之甚少。我读过feather不建议长期存储(因为API可能会变?不清楚)

  • 我不确定是否使用 pickle:我知道它不是一种安全格式,而且 API 不断变化并破坏向后兼容性

  • CSV 并不是一个真正的选择,因为在我的数据上推断数据类型通常是一场噩梦;将数据读回熊猫时,我需要明确声明格式,包括日期格式,否则:

    • pandas 可以创建列,其中一行是 dd-mm-yyyy,另一行是 mm-dd-yyyy(请参阅此处)。加
    • 我有很多文本列,其中前 10k 行似乎是数字,接下来的 100 行是文本,因此大多数软件会推断该列是数字,然后导入失败。也许我需要创建一个函数来导出一个包含所有数据类型定义、日期格式等的辅助文件?可行但麻烦

更新:这是一个有趣的比较,据此 HDF5 是最快的格式:https : //medium.com/@bobhaffner/gist-to-medium-test-db3d51b8ba7b

我似乎明白 HDF5 和 Parquet 之间的另一个区别是 datetime64 在 HDF5 中没有直接等价物。大多数人似乎将他们的日期作为 ISO 日期格式 (yyyy-mm-dd) 字符串存储在 HDF5 中。

HDF*_*org 7

如果您的数据是二维表并且用于像 Apache Spark 这样的大数据处理,请使用 parquet。HDF5 不适合处理您提到的日期/时间。

如果您的数据有 3 个或更多维度,HDF5 将是一个不错的选择——特别是对于长期归档、可移植性和共享。

如果性能很重要,Apache Feather 是最快的。


it'*_*het 6

如果您确实想避免 pickle 并保存 CSV(我不完全同意您关于那些不可行选项的说法),那么您可以运行本地数据库服务器来保存数据,并在以下情况下执行转储/恢复过程: SQL 服务器再次可用。否则:

使用对象to_pickle的方法DataFrame

或者,使用您的数据类型保存数据类型 json 文件,并在保存 CSV 时指定日期格式:

# export
import json
data_types = df.dtypes.astype(str).to_dict()
with open('data_type_key.json', 'w') as f
    json.dump(data_types, f)
df.to_csv('data.csv', date_format='%Y%m%d')

# import
data_types = json.loads('data_type_key.json')
data_frame = pd.read_csv(your_csv_path, dtype=data_types)
Run Code Online (Sandbox Code Playgroud)

  • 你读过问题了吗?他说“csv”不是一个选项,因为必须手动指定数据类型。 (3认同)
  • 就像我上面说得很清楚的那样,我不相信 pickle,因为它可能存在潜在的不安全性,但主要是因为不建议长期存储它,因为不建议向后兼容。 (3认同)
  • 看来你没有真正读过我的问题。我还解释了为什么使用 CSV(至少以您描述的方式)对我不起作用 (3认同)
  • @Pythonistaan​​onymous pickle 仅当您从不受信任的来源加载数据时才不安全,因为它可以运行任意 Python 代码。如果这不是问题,您也可以说“我不能使用 Python 源代码,因为它不安全”。Pickle 的主要兼容性问题更多地涉及 2-3 个问题。但是您始终可以显式修复 pickle 协议,只要您不尝试使其 2-3 兼容,就不应该有问题。 (2认同)
  • @Pythonistaan​​onymous,如果您担心有太多列来显式声明 dtypes,您可以使用 DataFrame.dtypes 创建一系列数据类型并将其保存为 json 作为重新加载 csv 的密钥。 (2认同)