Pandas создают новый фрейм данных, в котором 2-минутные данные выровнены с 1 минутой

#python #pandas

#python #pandas

Вопрос:

Вот тот же csv:

 Time,o1,h1,l1,c1,o2,h2,l2,c2
        2019.04.08 23:59:00,1.12582,1.1261,1.12582,1.12609,1.12588,1.12591,1.12587,1.12588
        2019.04.09 00:00:00,1.12587,1.12598,1.12587,1.12598,1.12583,1.1261,1.12582,1.12609
        2019.04.09 00:01:00,1.12599,1.12607,1.12587,1.12607,1.12598,1.12607,1.12587,1.12607
        2019.04.09 00:02:00,1.12607,1.12632,1.12605,1.12632,1.12598,1.12607,1.12587,1.12607
        2019.04.09 00:03:00,1.12603,1.12614,1.12603,1.12613,1.12607,1.12632,1.12603,1.12613
        2019.04.09 00:04:00,1.12613,1.12613,1.12609,1.12611,1.12607,1.12632,1.12603,1.12613
        2019.04.09 00:05:00,1.12612,1.12613,1.12612,1.12613,1.12613,1.12613,1.12609,1.12613
        2019.04.09 00:06:00,1.12613,1.12613,1.12613,1.12613,1.12613,1.12613,1.12609,1.12613
        2019.04.09 00:07:00,1.12613,1.12613,1.1261,1.12612,1.12613,1.12613,1.1261,1.12612
        2019.04.09 00:08:00,1.12612,1.12612,1.12612,1.12612,1.12613,1.12613,1.1261,1.12612
        2019.04.09 00:09:00,1.12612,1.12612,1.12609,1.12609,1.12612,1.12612,1.12609,1.12609
        2019.04.09 00:10:00,1.12609,1.12609,1.12602,1.12607,1.12612,1.12612,1.12609,1.12609
        2019.04.09 00:11:00,1.12607,1.12609,1.12607,1.12608,1.12609,1.12609,1.12602,1.12608
        2019.04.09 00:12:00,1.12608,1.12608,1.12608,1.12608,1.12609,1.12609,1.12602,1.12608
        2019.04.09 00:13:00,1.12608,1.12608,1.126,1.126,1.12608,1.12608,1.126,1.126
        2019.04.09 00:14:00,1.126,1.126,1.1259,1.12592,1.12608,1.12608,1.126,1.126
        2019.04.09 00:15:00,1.12592,1.12614,1.12592,1.12613,1.126,1.12614,1.1259,1.12613
        2019.04.09 00:16:00,1.12614,1.12619,1.12612,1.12619,1.126,1.12614,1.1259,1.12613
        2019.04.09 00:17:00,1.12619,1.1262,1.12615,1.12615,1.12614,1.1262,1.12612,1.12615
        2019.04.09 00:18:00,1.12616,1.12616,1.12608,1.12608,1.12614,1.1262,1.12612,1.12615
        2019.04.09 00:19:00,1.12608,1.12611,1.12608,1.12611,1.12616,1.12616,1.12608,1.12611
        2019.04.09 00:20:00,1.12608,1.12637,1.12608,1.1262,1.12616,1.12616,1.12608,1.12611
        2019.04.09 00:21:00,1.1262,1.12631,1.12614,1.12623,1.12608,1.12637,1.12608,1.12623
        2019.04.09 00:22:00,1.12624,1.12646,1.12619,1.12626,1.12608,1.12637,1.12608,1.12623
        2019.04.09 00:23:00,1.12626,1.12628,1.12585,1.1261,1.12624,1.12646,1.12585,1.1261
        2019.04.09 00:24:00,1.12609,1.12621,1.12607,1.12616,1.12624,1.12646,1.12585,1.1261
        2019.04.09 00:25:00,1.12615,1.12625,1.12609,1.1262,1.12609,1.12625,1.12607,1.1262
        2019.04.09 00:26:00,1.1262,1.12629,1.12615,1.12618,1.12609,1.12625,1.12607,1.1262
        2019.04.09 00:27:00,1.12618,1.12621,1.12614,1.12617,1.1262,1.12629,1.12614,1.12617
        2019.04.09 00:28:00,1.12618,1.12618,1.12586,1.12587,1.1262,1.12629,1.12614,1.12617
        2019.04.09 00:29:00,1.12586,1.12598,1.12586,1.12597,1.12618,1.12618,1.12586,1.12597
        2019.04.09 00:30:00,1.12598,1.12608,1.12594,1.12604,1.12618,1.12618,1.12586,1.12597
  

Я хочу знать, как в фрейме данных Pandas я могу это сделать:

 Time,o1,h1,l1,c1,o2,h2,l2,c2,o11,h11,l11,c11
2019.04.08 23:59:00,1.12582,1.1261,1.12582,1.12609,1.12588,1.12591,1.12587,1.12588,1.12587,1.12598,1.12587,1.12598
2019.04.09 00:01:00,1.12599,1.12607,1.12587,1.12607,1.12598,1.12607,1.12587,1.12607,1.12607,1.12632,1.12605,1.12632
2019.04.09 00:03:00,1.12603,1.12614,1.12603,1.12613,1.12607,1.12632,1.12603,1.12613,1.12613,1.12613,1.12609,1.12611
2019.04.09 00:05:00,1.12612,1.12613,1.12612,1.12613,1.12613,1.12613,1.12609,1.12613,1.12613,1.12613,1.12613,1.12613
2019.04.09 00:07:00,1.12613,1.12613,1.1261,1.12612,1.12613,1.12613,1.1261,1.12612,1.12612,1.12612,1.12612,1.12612
2019.04.09 00:09:00,1.12612,1.12612,1.12609,1.12609,1.12612,1.12612,1.12609,1.12609,1.12609,1.12609,1.12602,1.12607
  

Я хочу добавить данные от 2 минут до 1 минуты, как показано в приведенном выше примере.
Пожалуйста, дайте мне знать.

Комментарии:

1. Каков ваш метод добавления?

2. Подумываю создать новый столбец и записать в него данные. Но не знаю, возможно ли это с помощью python pandas.

Ответ №1:

Используйте Index.get_indexer для позиций столбца из списка и более подходящих строк DataFrame.iloc , последние DataFrame.join вместе:

 pos2 = df.columns.get_indexer(['o1','h1','l1','c1'])
df1 = df.iloc[0::2].reset_index(drop=True)
df2 = df.iloc[1::2, pos2].reset_index(drop=True)

df = df1.join(df2, rsuffix='1')
  

 print (df)

                   Time       o1       h1       l1       c1       o2       h2  
0   2019.04.08 23:59:00  1.12582  1.12610  1.12582  1.12609  1.12588  1.12591   
1   2019.04.09 00:01:00  1.12599  1.12607  1.12587  1.12607  1.12598  1.12607   
2   2019.04.09 00:03:00  1.12603  1.12614  1.12603  1.12613  1.12607  1.12632   
3   2019.04.09 00:05:00  1.12612  1.12613  1.12612  1.12613  1.12613  1.12613   
4   2019.04.09 00:07:00  1.12613  1.12613  1.12610  1.12612  1.12613  1.12613   
5   2019.04.09 00:09:00  1.12612  1.12612  1.12609  1.12609  1.12612  1.12612   
6   2019.04.09 00:11:00  1.12607  1.12609  1.12607  1.12608  1.12609  1.12609   
7   2019.04.09 00:13:00  1.12608  1.12608  1.12600  1.12600  1.12608  1.12608   
8   2019.04.09 00:15:00  1.12592  1.12614  1.12592  1.12613  1.12600  1.12614   
9   2019.04.09 00:17:00  1.12619  1.12620  1.12615  1.12615  1.12614  1.12620   
10  2019.04.09 00:19:00  1.12608  1.12611  1.12608  1.12611  1.12616  1.12616   
11  2019.04.09 00:21:00  1.12620  1.12631  1.12614  1.12623  1.12608  1.12637   
12  2019.04.09 00:23:00  1.12626  1.12628  1.12585  1.12610  1.12624  1.12646   
13  2019.04.09 00:25:00  1.12615  1.12625  1.12609  1.12620  1.12609  1.12625   
14  2019.04.09 00:27:00  1.12618  1.12621  1.12614  1.12617  1.12620  1.12629   
15  2019.04.09 00:29:00  1.12586  1.12598  1.12586  1.12597  1.12618  1.12618   

         l2       c2      o11      h11      l11      c11  
0   1.12587  1.12588  1.12587  1.12598  1.12587  1.12598  
1   1.12587  1.12607  1.12607  1.12632  1.12605  1.12632  
2   1.12603  1.12613  1.12613  1.12613  1.12609  1.12611  
3   1.12609  1.12613  1.12613  1.12613  1.12613  1.12613  
4   1.12610  1.12612  1.12612  1.12612  1.12612  1.12612  
5   1.12609  1.12609  1.12609  1.12609  1.12602  1.12607  
6   1.12602  1.12608  1.12608  1.12608  1.12608  1.12608  
7   1.12600  1.12600  1.12600  1.12600  1.12590  1.12592  
8   1.12590  1.12613  1.12614  1.12619  1.12612  1.12619  
9   1.12612  1.12615  1.12616  1.12616  1.12608  1.12608  
10  1.12608  1.12611  1.12608  1.12637  1.12608  1.12620  
11  1.12608  1.12623  1.12624  1.12646  1.12619  1.12626  
12  1.12585  1.12610  1.12609  1.12621  1.12607  1.12616  
13  1.12607  1.12620  1.12620  1.12629  1.12615  1.12618  
14  1.12614  1.12617  1.12618  1.12618  1.12586  1.12587  
15  1.12586  1.12597  1.12598  1.12608  1.12594  1.12604  
  

РЕДАКТИРОВАТЬ: для добавления недостающих строк с частотой в одну минуту с помощью DataFrame.asfreq :

 print (df)
                  Time       o1       h1       l1       c1       o2       h2  
0  2019.04.10 16:16:00  1.12308  1.12340  1.12304  1.12327  1.12350  1.12369   
1  2019.04.10 16:17:00  1.12327  1.12333  1.12302  1.12322  1.12308  1.12340   
2  2019.04.10 16:21:00  1.12314  1.12354  1.12313  1.12353  1.12314  1.12354   
3  2019.04.10 16:22:00  1.12353  1.12362  1.12345  1.12359  1.12314  1.12354   
4  2019.04.10 16:23:00  1.12359  1.12389  1.12357  1.12383  1.12353  1.12389   
5  2019.04.10 16:24:00  1.12383  1.12396  1.12375  1.12384  1.12353  1.12389   
6  2019.04.10 16:25:00  1.12383  1.12389  1.12373  1.12376  1.12383  1.12396   
7  2019.04.10 16:26:00  1.12376  1.12386  1.12355  1.12361  1.12383  1.12396   

        l2       c2  
0  1.12300  1.12308  
1  1.12302  1.12322  
2  1.12313  1.12353  
3  1.12313  1.12353  
4  1.12345  1.12383  
5  1.12345  1.12383  
6  1.12373  1.12376  
7  1.12373  1.12376  
  

 df['Time'] = pd.to_datetime(df['Time'])
df = df.set_index('Time').asfreq('1min').reset_index()
#if need forward filling missing values
#df = df.set_index('Time').asfreq('1min', method='ffill').reset_index()
print (df)
                  Time       o1       h1       l1       c1       o2       h2  
0  2019-04-10 16:16:00  1.12308  1.12340  1.12304  1.12327  1.12350  1.12369   
1  2019-04-10 16:17:00  1.12327  1.12333  1.12302  1.12322  1.12308  1.12340   
2  2019-04-10 16:18:00      NaN      NaN      NaN      NaN      NaN      NaN   
3  2019-04-10 16:19:00      NaN      NaN      NaN      NaN      NaN      NaN   
4  2019-04-10 16:20:00      NaN      NaN      NaN      NaN      NaN      NaN   
5  2019-04-10 16:21:00  1.12314  1.12354  1.12313  1.12353  1.12314  1.12354   
6  2019-04-10 16:22:00  1.12353  1.12362  1.12345  1.12359  1.12314  1.12354   
7  2019-04-10 16:23:00  1.12359  1.12389  1.12357  1.12383  1.12353  1.12389   
8  2019-04-10 16:24:00  1.12383  1.12396  1.12375  1.12384  1.12353  1.12389   
9  2019-04-10 16:25:00  1.12383  1.12389  1.12373  1.12376  1.12383  1.12396   
10 2019-04-10 16:26:00  1.12376  1.12386  1.12355  1.12361  1.12383  1.12396   

         l2       c2  
0   1.12300  1.12308  
1   1.12302  1.12322  
2       NaN      NaN  
3       NaN      NaN  
4       NaN      NaN  
5   1.12313  1.12353  
6   1.12313  1.12353  
7   1.12345  1.12383  
8   1.12345  1.12383  
9   1.12373  1.12376  
10  1.12373  1.12376 
  

 pos2 = df.columns.get_indexer(['o1','h1','l1','c1'])
df1 = df.iloc[0::2].reset_index(drop=True)
df2 = df.iloc[1::2, pos2].reset_index(drop=True)

df = df1.join(df2, rsuffix='1')
print (df)
                 Time       o1       h1       l1       c1       o2       h2  
0 2019-04-10 16:16:00  1.12308  1.12340  1.12304  1.12327  1.12350  1.12369   
1 2019-04-10 16:18:00      NaN      NaN      NaN      NaN      NaN      NaN   
2 2019-04-10 16:20:00      NaN      NaN      NaN      NaN      NaN      NaN   
3 2019-04-10 16:22:00  1.12353  1.12362  1.12345  1.12359  1.12314  1.12354   
4 2019-04-10 16:24:00  1.12383  1.12396  1.12375  1.12384  1.12353  1.12389   
5 2019-04-10 16:26:00  1.12376  1.12386  1.12355  1.12361  1.12383  1.12396   

        l2       c2      o11      h11      l11      c11  
0  1.12300  1.12308  1.12327  1.12333  1.12302  1.12322  
1      NaN      NaN      NaN      NaN      NaN      NaN  
2      NaN      NaN  1.12314  1.12354  1.12313  1.12353  
3  1.12313  1.12353  1.12359  1.12389  1.12357  1.12383  
4  1.12345  1.12383  1.12383  1.12389  1.12373  1.12376  
5  1.12373  1.12376      NaN      NaN      NaN      NaN  
  

Комментарии:

1. Но я также хочу получить данные o2,h2,l2,c2 .

2. @JafferWilson — извините, я пропустил это, ответ был изменен для всех столбцов для df1

3. Можно проверить делимость по минутам времени, потому что может случиться, что в наборе данных отсутствуют записи. Итак, я могу узнать, как проверить 2 минуты и добавить к первой минуте, что это было бы лучшим решением.

4. @Jaffer Wilson — df = df. set_index('Time'). asfreq('1min'). reset_index() Сначала используйте

5. Спасибо, я думаю, это поможет.

Ответ №2:

разделите данные, затем соедините:

 # split data every other row
n = df[0::2]
n1 = df[1::2]

# reset_index and join
new_df = n.reset_index(drop=True).join(n1.reset_index(drop=True), rsuffix='_other')
  

Затем удалите ненужные столбцы