处理时间相关数据的Python库?

2024-05-23 14:22:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些数据(美国国家海洋和大气管理局提供的天气预报),我正在努力工作。有各种数据系列(温度、湿度等),每个数据系列都包含一系列数据点,并在不同的时间尺度(有些系列是每小时一次,有些是每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系列,但在这种情况下,不需要对所有的预处理数据进行随机访问。你知道吗


Tags: 数据db时间val国家温度temp管理局
3条回答

SQLite具有日期类型。您还可以将所有时间转换为epoch之后的秒数(通过time.gmtime()time.localtime()),这使得比较变得很简单。你知道吗

这是一个典型的行到列问题,在一个好的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动态生成这样的查询。你知道吗

如果对数据进行了排序,则可以使用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

相关问题 更多 >