Переиндексация данных временных рядов - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть проблема, похожая на "ValueError: невозможно переиндексировать с двойной оси" . Решение не предусмотрено.

У меня есть файл Excel, содержащий несколько строк и столбцов данные о погоде. Данные отсутствуют с определенными интервалами, хотя не показаны в примере ниже. Я хочу переиндексировать временной столбец с 5-минутными интервалами, чтобы я мог интерполировать пропущенные значения. Пример данных:


Date        Time    Temp    Hum Dewpnt  WindSpd
04/01/18    12:05 a 30.6    49  18.7    2.7
04/01/18    12:10 a NaN     51  19.3    1.3
04/01/18    12:20 a 30.7   NaN  19.1    2.2
04/01/18    12:30 a 30.7    51  19.4    2.2 
04/01/18    12:40 a 30.9    51  19.6    0.9

Вот что я попробовал.

import pandas as pd
ts = pd.read_excel('E:\DATA\AP.xlsx')
ts['Time'] = pd.to_datetime(ts['Time'])
ts.set_index('Time', inplace=True)
dt = pd.date_range("2018-04-01 00:00:00", "2018-05-01 00:00:00", freq='5min', name='T')
idx = pd.DatetimeIndex(dt)
ts.reindex(idx)

Я просто хочу, чтобы мой индекс имел частоту 5 минут, чтобы я мог интерполировать позже. Ожидаемый результат:

Date        Time    Temp    Hum Dewpnt  WindSpd
04/01/18    12:05 a 30.6    49  18.7    2.7
04/01/18    12:10 a NaN     51  19.3    1.3
04/01/18    12:15 a NaN   NaN  NaN     NaN
04/01/18    12:20 a 30.7   NaN  19.1    2.2
04/01/18    12:25 a NaN   NaN  NaN     NaN
04/01/18    12:30 a 30.7    51  19.4    2.2  

Ответы [ 5 ]

1 голос
/ 14 февраля 2020

Еще один подход.

df['Time'] = pd.to_datetime(df['Time'])
df = df.set_index(['Time']).resample('5min').last().reset_index()
df['Time'] = df['Time'].dt.time
df

вывод

       Time     Date        Temp    Hum     Dewpnt  WindSpd
0   00:05:00    4/1/2018    30.6    49.0    18.7    2.7
1   00:10:00    4/1/2018    NaN     51.0    19.3    1.3
2   00:15:00    NaN         NaN     NaN     NaN     NaN
3   00:20:00    4/1/2018    30.7    NaN     19.1    2.2
4   00:25:00    NaN         NaN     NaN     NaN     NaN
5   00:30:00    4/1/2018    30.7    51.0    19.4    2.2
6   00:35:00    NaN         NaN     NaN     NaN     NaN
7   00:40:00    4/1/2018    30.9    51.0    19.6    0.9

Если необходимо повторно выбрать время из нескольких дат, используйте код ниже.

Однако позже вам придется разделить столбцы «Дата» и «Время».

df1['DateTime'] = df1['Date']+df1['Time']
df1['DateTime'] = pd.to_datetime(df1['DateTime'],format='%d/%m/%Y%I:%M %p')
df1 = df1.set_index(['DateTime']).resample('5min').last().reset_index()
df1

Вывод

DateTime    Date    Time    Temp    Hum     Dewpnt  WindSpd
0   2018-01-04 00:05:00     4/1/2018    12:05 AM    30.6    49.0    18.7    2.7
1   2018-01-04 00:10:00     4/1/2018    12:10 AM    NaN     51.0    19.3    1.3
2   2018-01-04 00:15:00     NaN     NaN     NaN     NaN     NaN     NaN
3   2018-01-04 00:20:00     4/1/2018    12:20 AM    30.7    NaN     19.1    2.2
4   2018-01-04 00:25:00     NaN     NaN     NaN     NaN     NaN     NaN
5   2018-01-04 00:30:00     4/1/2018    12:30 AM    30.7    51.0    19.4    2.2
6   2018-01-04 00:35:00     NaN     NaN     NaN     NaN     NaN     NaN
7   2018-01-04 00:40:00     4/1/2018    12:40 AM    30.9    51.0    19.6    0.9
0 голосов
/ 14 февраля 2020

Я получил его на работу. Спасибо всем за ваше время. Я предоставляю рабочий код.

import pandas as pd
df = pd.read_excel('E:\DATA\AP.xlsx', sheet_name='Sheet1', parse_dates=[['Date', 'Time']])
df = df.set_index(['Date_Time']).resample('5min').last().reset_index()
print(df)
0 голосов
/ 13 февраля 2020

Установите столбец Time в качестве индекса, убедившись, что это тип DateTime, затем попробуйте

ts.asfreq('5T')

, используйте

ts.asfreq('5T', method='ffill')

, чтобы перенести предыдущие значения вперед.

0 голосов
/ 13 февраля 2020

Я бы взял подход к созданию пустой таблицы и заполнил ее данными, полученными из вашего источника данных. Для этого примера три наблюдения читаются как NaN, плюс отсутствует строка для 1:15 и 1:20.

import pandas as pd
import numpy as np
rawpd = pd.read_excel('raw.xlsx')
print(rawpd)
    Date      Time  Col1  Col2

0 2018-04-01 01:00:00 1.0 10.0
1 2018-04-01 01:05:00 2,0 NaN
2 2018-04-01 01:10:00 NaN 10,0
3 2018-04-01 01:20:00 NaN 10,0
4 2018-04-01 01:30:00 5.0 10.0

Теперь создайте файл данных с идеальной структурой.

time5min = pd.date_range(start='2018/04/1 01:00',periods=7,freq='5min')
targpd = pd.DataFrame(np.nan,index = time5min,columns=['Col1','Col2'])
print(targpd)

                 Col1  Col2 

2018-04-01 01:00 : 00 NaN NaN
2018-04-01 01:05:00 NaN NaN
2018-04-01 01:10:00 NaN NaN
2018-04-01 01:15:00 NaN NaN
2018-04-01 01:20:00 NaN NaN
2018-04-01 01:25:00 NaN NaN
2018-04-01 01:30:00 NaN NaN

Теперь дело в том, чтобы обновить targpd данными, отправленными вам в rawpd. Чтобы это произошло, столбцы даты и времени должны быть объединены в rawpd и преобразованы в индекс.

print(rawpd.Date,rawpd.Time)

0 2018-04-01
1 2018-04-01
2 2018 -04-01
3 2018-04-01
4 2018-04-01

Имя: Дата, тип: datetime64 [нс]
0 01: 00: 00
1 01:05:00
2 01:10:00
3 01:20:00
4 01:30:00
Имя: Время, dtype: object
Вы можете видеть выше хитрость во всем этом. Ваши данные даты были преобразованы в datetime, но ваши данные времени - просто строка. Ниже надлежащий индекс создается с помощью функции lambda .

rawidx=rawpd.apply(lambda r : pd.datetime.combine(r['Date'],r['Time']),1)
print(rawidx)

Это можно применить к базе данных rawpd в качестве индекса.

rawpd2=pd.DataFrame(rawpd[['Col1','Col2']].values,index=rawidx,columns=['Col1','Col2'])
rawpd2=rawpd2.sort_index()
print(rawpd2)

Once эта команда обновления может получить то, что вы хотите.

targpd.update(rawpd2,overwrite=True)
print(targpd)

                 Col1  Col2

2018-04-01 01:00:00 1.0 10.0

2018-04-01 01 : 00: 00 1,0 10,0

2018-04-01 01:05:00 2,0 NaN

2018-04-01 01:10:00 NaN 10,0

2018- 04-01 01:15:00 NaN NaN

2018-04-01 01:20:00 NaN 10.0

2018-04-01 01:25:00 NaN NaN

2018-04-01 01:30:00 5,0 10,0

2018-04-01 01:05:00 2,0 NaN

2018-04-01 01:10:00 NaN 10,0

2018-04-01 01:15:00 NaN NaN

2018-04-01 01:20:00 NaN 10.0

2018-04-01 01:25 : 00 NaN NaN

2018-04-01 01:30:00 5.0 10.0

Теперь у вас есть файл, готовый для интерполяции

0 голосов
/ 13 февраля 2020

Вы можете попробовать это, например:

import pandas as pd
ts = pd.read_excel('E:\DATA\AP.xlsx')
ts['Time'] = pd.to_datetime(ts['Time'])
ts.set_index('Time', inplace=True)
ts.resample('5T').mean()

Дополнительная информация здесь: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.resample.html

...