Python 在保留数据类型的同时导出数据帧的格式是什么?不是CSV;Sqlite?拼花地板?

Python 在保留数据类型的同时导出数据帧的格式是什么?不是CSV;Sqlite?拼花地板?,python,pandas,parquet,feather,Python,Pandas,Parquet,Feather,我的工作流程通常涉及将一些数据(通常来自CSV文件)加载到pandas数据框中,对其进行清理,为每个列定义正确的数据类型,然后将其导出到SQL server 对于SQL server不可用的情况,有什么好的替代方法来存储已清理的数据和每列数据类型的显式定义? 我测试过的唯一真正的解决方案是导出到sqlite.db 文件,使用答案确保日期被读取为 日期 羽毛、HDF5、拼花地板怎么样?熊猫,但我对这些格式不太了解。我已经阅读了feather不建议长期存储(因为API可能会更改?不清楚) 我不确定

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

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

  • 我测试过的唯一真正的解决方案是导出到sqlite.db 文件,使用答案确保日期被读取为 日期
  • 羽毛、HDF5、拼花地板怎么样?熊猫,但我对这些格式不太了解。我已经阅读了feather不建议长期存储(因为API可能会更改?不清楚)

  • 我不确定是否要使用pickle:我知道它不是一种安全的格式,而且API一直在改变和破坏 相容性

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

    • 熊猫可以创建列,其中一行是dd-mm-yyyy,另一行是mm-dd-yyyy(请参见)。加上
    • 我有许多文本列,其中前10k行似乎是数字,下100行是文本,因此大多数软件会推断该列是数字列,然后导入失败也许我需要创建一个函数来导出包含所有数据类型定义、日期格式等的辅助文件?可行但繁琐
更新:这是一个有趣的比较,根据HDF5是最快的格式:


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

如果你真的想避免pickle和保存CSV(我不完全同意你关于那些不可行选项的说法)然后,您可以运行本地数据库服务器将数据保存在中,并在SQL server再次可用时执行转储/恢复过程。否则:

使用
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)

如果您的数据是二维表格,并且用于像ApacheSpark这样的大数据处理,请使用拼花地板。HDF5不适合处理您提到的日期/时间

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


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

您的数据有多大?不是“大数据”领域!在80-85%的情况下,我处理的表不是很大:10到100MB。在15-20%的情况下,我处理100 MB到1 GB范围内的表。到目前为止,我从未处理过大于1GB的表。我说的是未压缩CSV的sze。我想你会在
xlsx
中找到最好的运气,因为如果我们从广义上看数字、文本和日期,它将大部分保留数据类型。但100%可以肯定的是,您需要SQL server,而SQL server不是您的选项。除了读取xlsx比将大多数其他格式读入pandas慢得多之外,使用xlsx比使用sqlite.db文件、HDF5或拼花地板有什么好处?您不能在Excel中定义数据类型,因为Excel对我来说是一个破坏者。我有很长的数字(>16位),Excel无法处理,因此它将最后的数字切掉,并将其转换为零。基因名称被重新格式化为日期(查找)。所有这些都是破坏交易的因素,让我无法接受xlsx。你读过这个问题了吗?他说,
csv
不是一个选项,因为它必须手动指定数据类型。正如我在上面非常清楚地说的,我不相信pickle,因为它可能不安全,但主要是因为不建议长期存储,因为不建议向后兼容。似乎你没有真正阅读我的问题。我还解释了为什么使用CSV(至少按照您所描述的方式)对您不起作用me@Pythonistaanonymouspickle只有在从不受信任的源加载数据时才是不安全的,因为它可以运行任意Python代码。如果这不是一个问题,您也可以说“我不能使用Python源代码,因为它不安全”。pickle的主要兼容性问题更多地涉及到2-3个问题。但是你总是可以明确地修复pickle协议,只要你不想让它2-3兼容,这不应该有问题。@Pythonistaanonymous如果您担心有太多列可以显式声明数据类型,您可以使用DataFrame.dtypes创建一系列数据类型,并将其保存为json作为重新加载csv的键。我看到很多评论说,对于长期存储来说,拼花地板比羽毛更好,但我不太清楚为什么。此外,如果没有这些格式,那么在Windows应用程序中读取数据或导入SQL server就特别容易,完全跳过Python:Parquet占据了等效feather文件的三分之一到一半空间。这是我注意到的与存储有关的唯一区别。