【问题标题】:Avoiding duplicate data in hdf5 or sqlite避免 hdf5 或 sqlite 中的重复数据
【发布时间】:2015-09-09 21:29:36
【问题描述】:

我正在提取 30 天的历史数据并对其进行修改。

希望我可以阅读历史数据并让它参考 30 天的动态滚动日期。 “日期时间”值是原始数据中的一列。

df_new = df = pd.read_csv(loc+filename)
max_date = df_new['DateTime'].max()
date_range = max_date - Timedelta(30, unit='d')

df_old = pd.read_hdf(loc+filename,'TableName', where = [('max_date > date_range')])

然后我会读取新数据,它是一个单独的文件,始终是本月至今的值(例如,整个六月,这个文件每天都会被最新数据替换),并将它们连接到旧数据框。

frames = [df_old, df_new]
df = pd.concat(frames)

然后我对文件做一些事情(我正在检查某些值是否在 30 天的窗口内重复,如果它们重复,那么我在列中放置一个时间戳)。

现在我想将修改后的数据添加回我的原始文件(它是 HDF5,但也可以是 .sqlite 文件),名为 df_old。当然,由于我正在阅读前 30 天的数据和 MTD 数据,因此存在大量重复数据。我该如何管理?

我唯一的解决方案是读取整个文件(df_old 以及我添加的新数据),然后删除重复项,然后再次覆盖它。这不是很有效。

.sqlite 或 .hdf 格式可以强制不重复吗?如果是这样,那么我有 3 列标识一个唯一值(日期、EmpID、CustomerID)。我不想要完全重复的行。

【问题讨论】:

  • 你见过插入还是忽略? (sqlite.org/lang_insert.html) 请注意,与其关闭唯一元组(Date、EmpID、CustomerID),不如在 Sqlite 表中需要一个唯一键列或者可能只是一个整数主键。

标签: python sqlite pandas hdf5


【解决方案1】:

在 sqlite 中将它们定义为主键。它不允许您拥有一组非唯一的主键。

例如

CREATE TABLE table (
a INT,
b INT,
c INT,
PRIMARY KEY(a,b)
);

不允许您将重复的 a、b 添加到数据中。然后使用 INSERT OR IGNORE 添加数据,任何重复的都将被忽略。

http://sqlite.org/lang_insert.html

【讨论】:

  • 我应该先在命令提示符中创建表格,然后添加我的实际原始数据(1.6gig csv 文件)。我在创建主键方面遇到了 Firefox sqlite 扩展问题,并且没有看到忽略选项
  • 您可以在 sqlite 命令提示符下或通过 python 中的连接创建表。请参阅 python 的 sqlite3 库。我可能会在 sqlite3 中创建表,然后通过 sqlite3 库从 python 连接到 sqlite,然后循环遍历 python 中的所有行,同时将它们添加到 sqlite3 数据库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 2016-04-17
  • 2015-05-19
  • 2019-03-09
相关资源
最近更新 更多