我是Python新手,对于在我的代码中存储数据的“最佳”方式,可能是一个非常基本的问题。任何建议都非常感谢!
我有一个很长的.csv文件,格式如下:
Scenario,Year,Month,Value
1,1961,1,0.5
1,1961,2,0.7
1,1961,3,0.2
etc.
我的场景值从1到100,年份从1961年到1990年,月份从1到12.我的文件因此有100 * 29 * 12 = 34800行,每行都有一个相关值。
我想把这个文件读成某种Python数据结构,这样我就可以通过指定'Scenario','Year'和'Month'来访问'Value'。请问最好的方法是什么(或者有哪些选择)?
在我的脑海中,我认为这些数据是一种“数字长方体”,其中包含Scenario,Year和Month的轴,因此每个Value都位于坐标(Scenario,Year,Month)。出于这个原因,我很想尝试将这些值读入3D numpy数组,并使用Scenario,Year和Month作为索引。这是明智的做法吗?
我想我也可以创建一个字典,其中键是
str(Scenario)+str(Year)+str(Month)
这会更好吗?还有其他选择吗?
('更好'我想我的意思是'访问速度更快',尽管如果一种方法比另一种方法的内存密集程度要低得多,那么也很了解它。)
非常感谢!
答案 0 :(得分:8)
我会使用元组词典。简单,快速,并且哈希表查找以检索单个值:
import csv
reader = csv.reader(open('data.csv', 'rb'))
header = reader.next()
data = {}
for row in reader:
key = tuple([int(v) for v in row[:-1]])
val = row[-1]
data[key] = float(val)
# Retrieve a value
print data[1, 1961, 3]
答案 1 :(得分:4)
我会使用sqlite3将数据存储到磁盘。您将能够通过SQL查询读取完整的数据集或子集。然后,您可以将该数据加载到numpy数组或其他Python数据结构中 - 这对于任务来说最方便。
如果您确实选择使用sqlite,请注意sqlite具有TIMESTAMP数据类型。
将年份和月份合并为一个TIMESTAMP可能是个好主意。当您将TIMESTAMP读入Python时,可以告诉sqlite3
自动将TIMESTAMP转换为datetime.datetime
个对象,这将减少您必须编写的一些样板代码。它还可以更容易地形成SQL查询,这些查询要求两个日期之间的所有行。
答案 2 :(得分:2)
sqlite是一个很好的选择。
如果情况并非如此,并且您将始终通过此三元组(方案,年,月)访问,则可以使用元组(不可变列表)作为键,将值作为值。
在代码中它看起来像:
d = {}
d[1, 1961, 12] = 0.5
或更通用的循环代码:
d[scenario, year, month] = value
稍后您可以通过以下方式访问它:
print d[scenario, year, month]
Python会自动为你创建元组。
答案 3 :(得分:0)
制作一本你所描述的字典词典。如果您需要数据作为数字,请在读取数据时将其转换为数字,并将数字存储在数字中。它会比使用字符串作为键更快。如果需要帮助代码,请告诉我。