【发布时间】:2017-04-26 07:35:27
【问题描述】:
我正在尝试在 Python 中构建一些代码以将列中的多个值分成单独的行,并根据时间戳的同一天聚合 Active-Ticket 的列,是否可以使用任何内部库或者我可以使用需要安装外部库吗?
我的示例文件是(目前,Active-Tickets 列是空的):
Input.csv
Timestamp,CaseID,Active-Tickets
14FEB2017:10:55:23,K456 G578 T213,
13FEB2017:10:56:12,F891 A63,
14FEB2017:11:59:14,T427 T31212 F900000,
15FEB2017:03:55:23,K456 G578 T213,
14FEB2017:05:56:12,F891 A63,
我想要达到的目标:
输出.csv
Timestamp,CaseID,Active-Tickets
14FEB2017:10:55:23,K456,8 (because there are 8 cases happened on the same day)
14FEB2017:10:55:23,G578,8
14FEB2017:10:55:23,T213,8
13FEB2017:10:56:12,F891,2 (because there are 2 cases happened on the same day)
13FEB2017:10:56:12,A63,2
14FEB2017:11:59:14,T427,8
14FEB2017:11:59:14,T31212,8
14FEB2017:11:59:14,F900000,8
15FEB2017:03:55:23,K456,3 (because there are 3 cases happened on the same day)
15FEB2017:03:55:23,G578,3
15FEB2017:03:55:23,T213,3
14FEB2017:05:56:12,F891,8
14FEB2017:05:56:12,A63,8
我的想法是:
获取时间戳列的值
检查日期是否相同,
将所有以空格分隔的 CaseID 存储到基于日期的列表中,
然后计算每个日期列表中元素的数量
将计数元素的值返回到
Active-Tickets。
但是这里的问题是,数据量不小,假设一天最少有50个案例,那我觉得我的方法不太可能。
【问题讨论】:
-
我将使用由日期字段索引的哈希值,其中值将是由具有数字作为值的 CaseID 索引的哈希值。使用 defaultdict 实现应该非常简单,只要它可以放入内存。如果您的数据非常庞大,您可以查看
shelve或sqlite3模块。但是这个问题目前相当广泛...... -
@SergeBallesta 谢谢。我会看看这些模块。每个文件的数据大约 2gb,所以我只能测试包含数千个数据的样本。当您说 sqlite3 模块时,这是否意味着我需要为 csv 文件创建一个数据库?
-
取决于输入文件是否按日期/时间戳排序。如果是这样,您只需要在内存中保留一天,所以只需忘记搁置或 sqlite3。如果订单是纯随机的,您可以首先使用外部排序程序回退到第一个用例,或者直接使用数据库存储在磁盘上,所以是的,您可以将 csv 文件的相关部分存储到 sqlites3 数据库中并使用查询
GROUP BY dat, caseid.
标签: python csv python-2.6