2017-02-19 17 views
2

У меня есть набор данных, который содержит данные, собранные каждую минуту с 1 ноября по 15 ноября. Время - столбец, начиная с 11/1/2016 00:00:00 и заканчивая на 11/15/2016 23:59:59 I am trying to reshape this dataset, so that each minute is a column, and each day is a row. So [строка 1, столбец 1] would have the data at 12:00 on 11/1, and [ строка 2, столбец 1] `будет иметь данные в 12:00 на 11/2, и так далее. В настоящее время мой набор данныхПроблема с изменением моих данных для ежедневных временных рядов

Я пытаюсь использовать функцию reshape, и если я проверю значения, они не совпадают правильно. В моем коде Столбец 2 из myData - это данные, которые мне нужно изменить, и у меня 1440 столбцов, потому что это количество минут в день. И 15 строк, потому что это количество дней, которые у меня есть в моем наборе данных.

Любая идея, где я могу ошибиться?

myData = pd.read_csv("Nov1-15.csv") 
myData = [myData.iloc[:,2]] 
myData = np.asarray(myData) 
myData = np.reshape(myData, (1440,15)) 
myData = np.transpose(myData) 

Мой массив, после того, как перекроить, в настоящее время выглядит следующим образом:

array([[ 137., 138., 136., ..., 345., 614., 337.], 
     [ 137., 137., 138., ..., 340., 611., 337.], 
     [ 138., 136., 138., ..., 373., 611., 336.], 
     ..., 
     [ 137., 138., 409., ..., 615., 336., 214.], 
     [ 136., 136., 412., ..., 614., 334., 214.], 
     [ 138., 136., 411., ..., 617., 339., 215.]]) 

Мой первоначальный набор данных выглядит следующим образом, после того, как я прочитал его из CSV и изолировать второй столбец:

[0  137.0 
1  137.0 
2  138.0 
3  137.0 
4  136.0 
5  138.0 
6  137.0 
7  141.0 
8  137.0 
9  139.0 
10  136.0 
11  136.0 
12  137.0 
13  136.0 
14  138.0 
15  138.0 
16  137.0 
17  136.0 
18  138.0 
19  137.0 
20  137.0 
21  138.0 
22  138.0 
23  137.0 
24  135.0 
25  138.0 
26  138.0 
27  138.0 
28  136.0 
29  136.0 
      ... 
21570 614.0 
21571 611.0 
21572 611.0 
21573 611.0 
21574 610.0 
21575 570.0 
21576 346.0 
21577 341.0 
21578 337.0 
21579 337.0 
21580 336.0 
21581 337.0 
21582 336.0 
21583 334.0 
21584 339.0 
21585 337.0 
21586 337.0 
21587 336.0 
21588 238.0 
21589 222.0 
21590 222.0 
21591 220.0 
21592 217.0 
21593 217.0 
21594 214.0 
21595 214.0 
21596 278.0 
21597 214.0 
21598 214.0 
21599 215.0 

образец данных:

11/1/2016 0:00  213 
11/1/2016 0:01  214 
11/1/2016 0:02  213 
11/1/2016 0:03  213 
11/1/2016 0:04  210 
11/1/2016 0:05  210 
11/1/2016 0:06  209 
11/1/2016 0:07  209 
+0

Можете ли вы разместить образец (3-5 строк) вашего происхождения al CSV-файл? У вас есть столбец «timestamp»? – MaxU

+1

Я добавил некоторые примеры данных. И у меня есть столбец timestamp в формате, который я включил в примеры данных. – Gary

ответ

2

Перепрофилирование:

попытка изменить:

myData = np.reshape(myData, (1440,15)) 

к:

myData = np.reshape(myData, (15, 1440)) 

Демонстрация:

3 строки, 4 колонки:

In [333]: np.arange(12).reshape(3,4) 
Out[333]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 

4 строк, 3 столбца:

In [334]: np.arange(12).reshape(4,3) 
Out[334]: 
array([[ 0, 1, 2], 
     [ 3, 4, 5], 
     [ 6, 7, 8], 
     [ 9, 10, 11]]) 

Панды решение:

pivot использовать метод, если вы не имеете лаги (пропущенные минуты данных):

In [48]: df 
Out[48]: 
        ts val 
0 2016-11-16 00:00:00 213 
1 2016-11-16 00:01:00 214 
2 2016-11-16 00:02:00 213 
3 2016-11-16 00:03:00 213 
4 2016-11-16 00:04:00 210 
5 2016-11-16 00:05:00 210 
6 2016-11-16 00:06:00 209 
7 2016-11-16 00:07:00 209 

In [50]: df.assign(d=df.ts.dt.date, m=df.ts.dt.minute) \ 
      .pivot(index='d', columns='m', values='val') 
Out[50]: 
m    0 1 2 3 4 5 6 7 
d 
2016-11-16 213 214 213 213 210 210 209 209 

иным образом использовать pivot_table() метод:

In [52]: df.assign(d=df.ts.dt.date, m=df.ts.dt.minute) \ 
      .pivot_table(index='d', columns='m', values='val', aggfunc='mean', fill_value=0) 
Out[52]: 
m    0 1 2 3 4 5 6 7 
d 
2016-11-16 213 214 213 213 210 210 209 209 
+0

Изменение моего изменения на ваше предложение, работало :) – Gary