2016-04-14 4 views
2

У меня есть dataframe как этотReshape dataframe из нескольких столбцов в одной

2014-11-26 09:05:19.669 -0.000610 0.000000 -0.001526 -0.000610 -0.000305 
2014-11-26 09:05:20.169 -0.000610 -0.000610 0.000305 -0.000610 -0.000610 
2014-11-26 09:05:20.669 -0.001831 -0.000916 -0.000610 0.000610 -0.000305 
2014-11-26 09:05:21.169 -0.000916 -0.000305 -0.000305 -0.000610 -0.000610 
2014-11-26 09:05:21.669 0.000000 -0.000916 -0.000610 -0.000305 -0.000610 
2014-11-26 09:05:22.171 -0.001221 -0.000610 -0.000305 -0.000610 -0.000610 
2014-11-26 09:05:22.669 -0.000916 -0.000305 0.000610 -0.000610 -0.000305 
2014-11-26 09:05:23.169 -0.000610 -0.000610 -0.001221 -0.001221 -0.000610 

Индекс является DateTime. Первые столбцы - это данные в этом datetime. Последующие данные берут интервал в 1 мс. Таким образом, столбец [0] берется по индексу, столбец [1] в datetime + 1ms, столбец [2] = datetime + 2ms, ... Есть ли простой способ создать новый блок данных с одним столбцом, где все даты был рассчитан и вставлен в индекс в правильном положении? Есть 2500 таких столбцов!

ответ

1

Точный синтаксис может варьироваться в зависимости от того, как вы начинаете. Я начинаю с индексом по умолчанию и время хранится в столбце «индекс» и типа DateTime

>>> df 

        index   x   y   z 
0 2014-11-26 09:05:19.669 -0.000610 0.000000 -0.001526 
1 2014-11-26 09:05:20.169 -0.000610 -0.000610 0.000305 
2 2014-11-26 09:05:20.669 -0.001831 -0.000916 -0.000610 
3 2014-11-26 09:05:21.169 -0.000916 -0.000305 -0.000305 

Первый шаг состоит в том, чтобы стек данных, поэтому у вас есть один столбец, а затем создать count-type column, который расскажет нам, сколько миллисекунд добавить к каждому индексу.

>>> df2 = df.set_index('index').stack().reset_index() 
>>> df2['cumcnt'] = df2.groupby('index',as_index=False).cumcount() 

        index level_1   0 cumcnt 
0 2014-11-26 09:05:19.669  x -0.000610  0 
1 2014-11-26 09:05:19.669  y 0.000000  1 
2 2014-11-26 09:05:19.669  z -0.001526  2 
3 2014-11-26 09:05:20.169  x -0.000610  0 
4 2014-11-26 09:05:20.169  y -0.000610  1 
5 2014-11-26 09:05:20.169  z 0.000305  2 
6 2014-11-26 09:05:20.669  x -0.001831  0 
7 2014-11-26 09:05:20.669  y -0.000916  1 
8 2014-11-26 09:05:20.669  z -0.000610  2 
9 2014-11-26 09:05:21.169  x -0.000916  0 
10 2014-11-26 09:05:21.169  y -0.000305  1 
11 2014-11-26 09:05:21.169  z -0.000305  2 

Затем умножьте столбец 'cumcnt' с 1 миллисекунды TimeDelta и вот об этом ...

>>> df2['index'] = df2['index'] + pd.to_timedelta('1ms') * df2['cumcnt'] 

        index level_1   0 cumcnt 
0 2014-11-26 09:05:19.669  x -0.000610  0 
1 2014-11-26 09:05:19.670  y 0.000000  1 
2 2014-11-26 09:05:19.671  z -0.001526  2 
3 2014-11-26 09:05:20.169  x -0.000610  0 
4 2014-11-26 09:05:20.170  y -0.000610  1 
5 2014-11-26 09:05:20.171  z 0.000305  2 
6 2014-11-26 09:05:20.669  x -0.001831  0 
7 2014-11-26 09:05:20.670  y -0.000916  1 
8 2014-11-26 09:05:20.671  z -0.000610  2 
9 2014-11-26 09:05:21.169  x -0.000916  0 
10 2014-11-26 09:05:21.170  y -0.000305  1 
11 2014-11-26 09:05:21.171  z -0.000305  2 
Смежные вопросы