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

用于处理时间相关数据的Python库?,python,Python,我有一些数据(NOAA提供的天气预报),我正在努力处理。有各种数据系列(温度、湿度等),每个数据系列都包含一系列数据点,并在不同的时间尺度上索引成一个日期时间数组(一些系列是每小时一次,另一些是每3小时一次,一些是每天一次)。是否有任何类型的库可以处理此类数据,并以用户友好的方式访问这些数据。 理想的用法是: db = TimeData() db.set_val('2010-12-01 12:00','temp',34) db.set_val('2010-12-01 15:00','temp

我有一些数据(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}  
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
基本上,查询将返回每个系列的最新值。
我查看了scikits.timeseries,但它不太适合这个用例,因为它涉及大量的预计算(它希望所有数据都在一次操作中,没有随机访问设置)。

有一个日期类型。您还可以将自epoch以来的所有时间转换为秒(通过执行
time.gmtime()
time.localtime()
),这使得比较变得简单。

具有日期类型。您还可以将自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动态生成这样的查询

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

如果您的数据已排序,您可以使用模块快速获取最大时间小于或等于指定时间的条目

比如:

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}  
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
i=bisect\u right(时间,时间)
#乘以[j]=i
如果时间[i-1]==时间:
#精确匹配
值=值[i-1]
其他:
#插入
值=(值[i-1]+值[i])/2

如果对数据进行了排序,您可以使用模块快速获取最大时间小于或等于指定时间的条目

比如:

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}  
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
i=bisect\u right(时间,时间)
#乘以[j]=i
如果时间[i-1]==时间:
#精确匹配
值=值[i-1]
其他:
#插入
值=(值[i-1]+值[i])/2

除了您已经拥有的SQLite之外?或者除了您已经拥有的
datetime
包之外?除了您已经拥有的SQLite之外?或者除了您已有的
datetime
软件包之外?好吧,但这还不够。我基本上需要能够查询源数据中实际不存在的时间。这是关键。我基本上需要“模糊”匹配。我的意思是,我知道如何分解并在较低级别执行此操作,基本上将其视为重采样问题,但我希望有一种更高级别的方法来执行此操作。因此…您希望所有匹配都晚于时间X。查询时间字段>X的位置。我认为没有通用的更高级别的方法,因为值之间的插值有多种选择(例如,线性或立方)。我基本上需要能够查询源数据中实际不存在的时间。这是关键。我基本上需要“模糊”匹配。我的意思是,我知道如何分解并在较低级别执行此操作,基本上将其视为重采样问题,但我希望有一种更高级别的方法来执行此操作。因此…您希望所有匹配都晚于时间X。查询时间字段>X的位置。我认为没有通用的更高级别的方法,因为值之间的插值有多种选项(例如,线性或立方)。