我有一些数据(NOAA提供的天气预报)我正在尝试使用。有各种数据系列(温度,湿度等),每个数据系列包含一系列数据点,并在不同的时间尺度上指向日期时间数组(有些系列是每小时,有些是3小时,有些是每天)。是否有任何类型的库来处理这样的数据,并以用户友好的方式访问它。 理想的用法是:
db = TimeData()
db.set_val('2010-12-01 12:00','temp',34)
db.set_val('2010-12-01 15:00','temp',37)
db.set_val('2010-12-01 12:00','wind',5)
db.set_val('2010-12-01 13:00','wind',6)
db.query('2010-12-01 13:00') # {'wind':6, 'temp':34}
基本上,查询将返回每个系列的最新值。 我查看了scikits.timeseries,但由于涉及预计算的数量(它预期一次性中的所有数据,没有随机访问设置),因此对此用例不太合适。
答案 0 :(得分:1)
如果您的数据已排序,您可以使用bisect模块快速获取时间小于或等于指定时间的条目。
类似的东西:
i = bisect_right(times, time)
# times[j] <= time for j<i
# times[j] > time for j>=i
if times[i-1] == time:
# exact match
value = values[i-1]
else:
# interpolate
value = (values[i-1]+values[i])/2
答案 1 :(得分:0)
SQLite有一个日期类型。您也可以将所有时间转换为自纪元以来的秒数(通过time.gmtime()
或time.localtime()
),这使得比较变得微不足道。
答案 2 :(得分:0)
这是一个经典的行到列问题,在一个好的SQL DBMS中你可以使用联合:
SELECT MAX(d_t) AS d_t, SUM(temp) AS temp, SUM(wind) AS wind, ... FROM (
SELECT d_t, 0 AS temp, value AS wind FROM table
WHERE type='wind' AND d_t >= some_date
ORDER BY d_t DESC LIMIT 1
UNION
SELECT d_t, value, 0 FROM table
WHERE type='temp' AND d_t >= some_date
ORDER BY d_t DESC LIMIT 1
UNION
...
) q1;
诀窍是为每个维度创建子查询,同时为其他维度提供占位符列。在Python中,您可以使用SQLAlchemy动态生成这样的查询。