Интегрирование более x значений типа pandas .Datetime - PullRequest
1 голос
/ 19 июня 2020

Я пытаюсь выполнить некоторую интеграцию с np.trapz некоторых данных, используя DatetimeIndex в качестве значений x, но результаты не такие, как я ожидал. Может ли кто-нибудь помочь мне?

Проблема:

У меня есть фрейм данных pandas, который имеет временные метки в качестве индексов и один столбец с данными об освещенности, называемый освещенностью. . Это выглядит следующим образом:

>>> data
Timestamp                Irradiance
2017-04-29 00:01:49     -1.16143
2017-04-29 00:06:49     -1.54857
2017-04-29 00:11:49     -2.03248
2017-04-29 00:16:49     -1.69373
2017-04-29 00:21:49     -1.35498
...     ...
2017-04-29 23:38:49     -1.93543
2017-04-29 23:43:49     -2.03222
2017-04-29 23:48:49     -2.85481
2017-04-29 23:53:49     -2.41937
2017-04-29 23:58:49     -2.17745
1921 rows × 1 columns

>>>data.index         
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>

>>>data["Irradiance"] 
<class 'pandas.core.series.Series'>

Теперь мне нравится интегрировать данные, чтобы получить полную освещенность за этот день. np.trapz(data["Irradiance"]) должен помочь, если временные метки были распределены равномерно: это не (в дневное время временные метки разнесены всего на 30 секунд, в отличие от 5 минут в ночное время).

Итак, я добавляю DatetimeIndex в качестве значений x к np.trapz, чтобы учесть неравномерно расположенные временные метки: np.trapz(data["Irradiance"], x = data.index)

Теперь результат:

>>>np.trapz(data["Irradiance"], x = data.index) 
numpy.timedelta64(17899433815886749,'ns')

Почему эта интеграция дает мне наносекундный выходной сигнал? Для меня это не имеет смысла. Я ожидал, что это даст какое-то значение, но определенно не это.

для ясности: так выглядят фактические данные при нанесении на график

1 Ответ

1 голос
/ 19 июня 2020

Функция np.trapz не может принимать DatetimeIndex в качестве входных данных. Однако вы можете рассчитать точки отсчета самостоятельно. Первая временная метка будет соответствовать 0, следующая - 300 (5 минут ночью) и так далее. Это можно сделать следующим образом:

sample_points = df.reset_index()['Timestamp'].diff().dt.total_seconds().fillna(0).cumsum().values

Затем вычислите интеграл:

np.trapz(data["Irradiance"], x=sample_points)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...