2010-12-01 3 views
1

У меня есть некоторые данные (прогнозы погоды, предоставленные NOAA) Я пытаюсь работать. Существуют различные серии данных (температура, влажность и т. Д.), Каждая из которых содержит ряд точек данных и индексы в массив данных, в разные временные масштабы (некоторые серии почасово, другие 3-часовые, некоторые ежедневно). Существует ли какая-либо библиотека для работы с подобными данными и доступ к ней в удобной для пользователя форме. Идеальное использование было бы что-то вроде:Библиотека Python для обработки временных данных?

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, но он не очень поддается этому варианту использования из-за количества предустановленных вычислений (он ожидает все данные одним выстрелом, без настройки произвольного доступа).

+1

Другие, чем SQLite, которые у вас уже есть? Или кроме пакета `datetime`, который у вас уже есть? – 2010-12-01 22:05:23

ответ

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 
0

SQLite имеет тип даты. Вы также можете конвертировать все время в секундах с эпохи (путем прохождения time.gmtime() или time.localtime()), что делает сравнение тривиальным.

+0

Ну, но это не совсем так. В основном я должен иметь возможность запрашивать время, которое на самом деле не существует в исходных данных. Это ключ к этому. Мне в основном нужно «нечеткое» сопоставление. Я имею в виду, я знаю, как сломаться и сделать это на более низком уровне, в основном рассматривая проблему передискретизации, но я надеялся, что это будет более высокий уровень. – 2010-12-01 22:10:17

0

Это классическая проблема строки к колонку, в хорошем SQL СУБД можно использовать союзы:

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 для динамического генерации такого запроса.

Смежные вопросы