Панды: создание даты и времени между двумя периодами и передача результата в виде новых строк во фрейме данных - PullRequest
2 голосов
/ 03 октября 2019

Я работаю над фреймом данных df со следующей структурой:

   start_time            end_time                key            vol
0  2018-08-23 00:00:00   2018-08-23 01:30:00     abcd_eg        0.92
1  2018-08-23 00:15:00   2018-08-23 01:45:00     defg_x2        0.27

Я пытаюсь сгенерировать 15-минутный интервал между временем начала и окончания. Я хотел бы привести в качестве новых строк в том же кадре данных (или новый кадр данных) следующим образом:

 start_time            end_time                  key             vol
0  2018-08-23 00:00:00   2018-08-23 01:30:00     abcd_eg         0.92
1  2018-08-23 00:15:00   2018-08-23 01:30:00     abcd_eg         0.92
2  2018-08-23 00:30:00   2018-08-23 01:30:00     abcd_eg         0.92
3  2018-08-23 00:45:00   2018-08-23 01:30:00     abcd_eg         0.92
4  2018-08-23 01:00:00   2018-08-23 01:30:00     abcd_eg         0.92
5  2018-08-23 01:15:00   2018-08-23 01:30:00     abcd_eg         0.92
6  2018-08-23 01:30:00   2018-08-23 01:30:00     abcd_eg         0.92
7  2018-08-23 00:15:00   2018-08-23 01:45:00     defg_x2         0.27
8  2018-08-23 00:30:00   2018-08-23 01:45:00     defg_x2         0.27
9  2018-08-23 00:45:00   2018-08-23 01:45:00     defg_x2         0.27
10 2018-08-23 01:00:00   2018-08-23 01:45:00     defg_x2         0.27
11 2018-08-23 01:15:00   2018-08-23 01:45:00     defg_x2         0.27
12 2018-08-23 01:30:00   2018-08-23 01:45:00     defg_x2         0.27
13 2018-08-23 01:45:00   2018-08-23 01:45:00     defg_x2         0.27

Столбцы даты имеют тип datetime[64], ключ object и объемfloat. До сих пор я пытался:

b=[]
lst = []
for i, row in df.iterrows():
b = pd.date_range(start=row.start_time, end=row.end_time, freq='15min',closed=None)
lst.append(b)

Использовал .iterrows(), поскольку у меня около 125 записей. Это дает мне временную серию как DatetimeIndex для всех значений времени начала и окончания в кадре данных с 15-минутными интервалами.

После этого я попытался передать lst в качестве нового столбца unpack в кадре данных df следующим образом:

df['unpack'] = lst

Я думал, что если бы я мог получить этизначения в качестве нового столбца в df, я мог бы использовать это решение , чтобы извлечь их в виде строк. Но этот процесс не работает.

Как я могу сделать это с пандами?

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Мои пятьдесят центов:

Сначала воссоздайте пример df:

df = pd.DataFrame({"start_time": [datetime(2018, 8, 23), datetime(2018, 8, 23, 0, 15)],
                   "end_time": [datetime(2018, 8, 23, 1, 30), datetime(2018, 8, 23, 1, 45)],
                   "key": ["abcd_eg", "defg_x2"],
                   "vol": [0.92, 0.27]})

Цикл по времени начала, создайте новый фрейм данных для каждого start_time с нужным индексом и сохраните их в списке.

dfs = []
for row in df.itertuples():
    part_df = pd.DataFrame(index=pd.DatetimeIndex(start=row.start_time, end=row.end_time, freq='15T'), 
                           data={'end_time': row.end_time, 'key': row.key, 'vol': row.vol})
    part_df.index.name = 'start_time'
    dfs.append(part_df)

Теперь объедините все кадры данных и сбросьте индекс:

result = pd.concat(dfs).reset_index()

, что дает следующий результат:

    start_time          end_time            key     vol
0   2018-08-23 00:00:00 2018-08-23 01:30:00 abcd_eg 0.92
1   2018-08-23 00:15:00 2018-08-23 01:30:00 abcd_eg 0.92
2   2018-08-23 00:30:00 2018-08-23 01:30:00 abcd_eg 0.92
3   2018-08-23 00:45:00 2018-08-23 01:30:00 abcd_eg 0.92
4   2018-08-23 01:00:00 2018-08-23 01:30:00 abcd_eg 0.92
5   2018-08-23 01:15:00 2018-08-23 01:30:00 abcd_eg 0.92
6   2018-08-23 01:30:00 2018-08-23 01:30:00 abcd_eg 0.92
7   2018-08-23 00:15:00 2018-08-23 01:45:00 defg_x2 0.27
8   2018-08-23 00:30:00 2018-08-23 01:45:00 defg_x2 0.27
9   2018-08-23 00:45:00 2018-08-23 01:45:00 defg_x2 0.27
10  2018-08-23 01:00:00 2018-08-23 01:45:00 defg_x2 0.27
11  2018-08-23 01:15:00 2018-08-23 01:45:00 defg_x2 0.27
12  2018-08-23 01:30:00 2018-08-23 01:45:00 defg_x2 0.27
13  2018-08-23 01:45:00 2018-08-23 01:45:00 defg_x2 0.27  
0 голосов
/ 03 октября 2019

Редактировать: я вижу, что вы добавили новую информацию. Может быть, это то, что вы ищете, если фиксированное количество 15-минутных интервалов, то вы можете попробовать это. Edit2: теперь он также работает с нефиксированными 15-минутными интервалами.

import pandas as pd

gap = '15min'

date_start = ['2018-08-23 00:00:00','2018-08-23 00:15:00','2018-08-24 00:45:00', '2018-08-24 00:30:00']

date_end = ['2018-08-23 01:30:00','2018-08-23 01:45:00','2018-08-24 01:00:00','2018-08-24 02:45:00']

count = 0
to_repeat = []

data = {'start_time':date_start,'end_time':date_end,'key':['abcd_eg','defg_x2', 'whef_98','tuyr_23'],'vol':[0.92,0.27,0.87,0.90]}

df = pd.DataFrame(data)

for _ in zip(date_start, date_end):

  temp = pd.date_range(_[0], _[1], freq=gap)
  to_repeat.append(len(temp))

  if count==0:
    ind = temp

  else:
    ind = ind.append(temp)

  count+=1

df_final = df.reindex(df.index.repeat(to_repeat))

df_final['start_time'] = ind

df_final.reset_index(inplace=True)
df_final.drop(columns='index',inplace=True)

print(df_final)

Вывод

            start_time             end_time      key   vol
0  2018-08-23 00:00:00  2018-08-23 01:30:00  abcd_eg  0.92
1  2018-08-23 00:15:00  2018-08-23 01:30:00  abcd_eg  0.92
2  2018-08-23 00:30:00  2018-08-23 01:30:00  abcd_eg  0.92
3  2018-08-23 00:45:00  2018-08-23 01:30:00  abcd_eg  0.92
4  2018-08-23 01:00:00  2018-08-23 01:30:00  abcd_eg  0.92
5  2018-08-23 01:15:00  2018-08-23 01:30:00  abcd_eg  0.92
6  2018-08-23 01:30:00  2018-08-23 01:30:00  abcd_eg  0.92
7  2018-08-23 00:15:00  2018-08-23 01:45:00  defg_x2  0.27
8  2018-08-23 00:30:00  2018-08-23 01:45:00  defg_x2  0.27
9  2018-08-23 00:45:00  2018-08-23 01:45:00  defg_x2  0.27
10 2018-08-23 01:00:00  2018-08-23 01:45:00  defg_x2  0.27
11 2018-08-23 01:15:00  2018-08-23 01:45:00  defg_x2  0.27
12 2018-08-23 01:30:00  2018-08-23 01:45:00  defg_x2  0.27
13 2018-08-23 01:45:00  2018-08-23 01:45:00  defg_x2  0.27
14 2018-08-24 00:45:00  2018-08-24 01:00:00  whef_98  0.87
15 2018-08-24 01:00:00  2018-08-24 01:00:00  whef_98  0.87
16 2018-08-24 00:30:00  2018-08-24 02:45:00  tuyr_23  0.90
17 2018-08-24 00:45:00  2018-08-24 02:45:00  tuyr_23  0.90
18 2018-08-24 01:00:00  2018-08-24 02:45:00  tuyr_23  0.90
19 2018-08-24 01:15:00  2018-08-24 02:45:00  tuyr_23  0.90
20 2018-08-24 01:30:00  2018-08-24 02:45:00  tuyr_23  0.90
21 2018-08-24 01:45:00  2018-08-24 02:45:00  tuyr_23  0.90
22 2018-08-24 02:00:00  2018-08-24 02:45:00  tuyr_23  0.90
23 2018-08-24 02:15:00  2018-08-24 02:45:00  tuyr_23  0.90
24 2018-08-24 02:30:00  2018-08-24 02:45:00  tuyr_23  0.90
25 2018-08-24 02:45:00  2018-08-24 02:45:00  tuyr_23  0.90
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...