pandas를 이용하여 날짜에 따라 그룹 연산을 하다

8571 단어 pandas날짜그룹화

원본 데이터


TS PERIOD REQUEST STEPPED VALUE STATUS SECONDS
20-DEC-16 00:00:00.0 600 1 0  2.018 0 1482163200
20-DEC-16 00:01:00.0 600 1 0  2.019 0 1482163260
20-DEC-16 00:02:00.0 600 1 0  2.019 0 1482163320
20-DEC-16 00:03:00.0 600 1 0  2.019 0 1482163380
20-DEC-16 00:04:00.0 600 1 0  2.019 0 1482163440
20-DEC-16 00:05:00.0 600 1 0  2.020 0 1482163500
20-DEC-16 00:06:00.0 600 1 0  2.020 0 1482163560
저희 목표는 TS를 따르는 거예요.

20-DEC-16 00:00:00.0
로 변환

20-DEC-16
의 형식을 지정한 다음 일 평균 값을 지정합니다.

패키지 가져오기


import numpy as np
from pandas import DataFrame, Series
import pandas as pd
from datetime import datetime

파일 읽기


df = pd.read_csv('data/test.txt',sep='\t')
여기에는 중국어 경로 이름과 절대 경로 문제가 해결되지 않았다.

데이터 상자로 변환


df = DataFrame(df)

시간 형식으로 변환


TS열을 시간 형식으로 변환하여 새 DATE로 저장한 후 DATE와 VALUE 두 열만 남기고 나머지는 모두 원하지 않습니다.

df['DATE'] = pd.to_datetime(df['TS'])
df = df[['DATE','VALUE']]

중요한 단계


'2017-9-4 00:00'에서'2017-9-4'로 바꿨어요.

df['DATE'] = [datetime.strftime(x,'%Y-%m-%d') for x in df['DATE']]
strftime에는 몇 가지 매개 변수가 있는데 그 중에서 Y는 네 자릿수의 해를 나타내고 m는 두 자릿수의 달을 나타낸다.

회전 데이터 상자


df =df.pivot_table(index='DATE',aggfunc='mean')
추가 정보: Pandas 및 Numpy를 사용하여 시간 스탬프를 사용하여 데이터를 Groupby 방식으로 그룹화
먼저 수요를 말씀드리자면 저는 데이터를 분 단위로 그룹을 나누고 1분 내의 데이터를 한 줄로 출력해야 합니다. 시간에 따라 데이터의 양이 다르기 때문에 모든 데이터는 가장 긴 그 그룹의 데이터를 기준으로 하고 부족한 데이터는 각자의 마지막 데이터로 보충해야 합니다.
이후에 제 데이터 원본을 소개해 드리겠습니다. 이전에 사용하지 않았던 데이터 열은 제거했습니다. 저는 사용할 데이터 데이터 열과 시간 스탬프 타임 열만 남겼습니다. 시간 스탬프는 초로 계산된 것입니다. 모두 407454줄입니다.


   data   time
0  6522.50 1.530668e+09
1  6522.66 1.530668e+09
2  6523.79 1.530668e+09
3  6523.79 1.530668e+09
4  6524.82 1.530668e+09
5  6524.35 1.530668e+09
6  6523.66 1.530668e+09
7  6522.64 1.530668e+09
8  6523.25 1.530668e+09
9  6523.88 1.530668e+09
10  6525.30 1.530668e+09
11  6525.70 1.530668e+09
...   ...   ...
407443 6310.69 1.531302e+09
407444 6310.55 1.531302e+09
407445 6310.42 1.531302e+09
407446 6310.40 1.531302e+09
407447 6314.03 1.531302e+09
407448 6314.04 1.531302e+09
407449 6312.84 1.531302e+09
407450 6312.57 1.531302e+09
407451 6312.56 1.531302e+09
407452 6314.04 1.531302e+09
407453 6314.04 1.531302e+09
 
[407454 rows x 2 columns]

데이터 처리를 시작하여 함수를 정의하고 DataFrame과 시간 열의 이름을 입력합니다.

def getdata_time(dataframe,name):
 dataframe[name] = dataframe[name]/60 # 
 dataframe[name] = dataframe[name].astype('int64') 
 datalen = dataframe.groupby(name).count().max()  #  
 timeframe = dataframe.groupby(name).count().reset_index()# DataFrame
 timeseries = timeframe['time'] 
 array = []  # 

 for time, group in dataframe.groupby(name): 
 tmparray = numpy.array(group['data']) # series 
 array.append(tmparray) 
 notimedata = pandas.DataFrame(array)
 notimedata = notimedata.fillna(method='ffill',axis = 1,limit=datalen[0]) # 
 notimedata[datalen[0]+1] = timeseries #  
 return notimedata
다음은 한 줄씩 분석할 것이다. 우선 분당을 근거로 그룹을 나누어야 한다. 그러면 초계의 시간 스탬프를 60에서 분으로 나누고 int형으로 바꾸는 것은 관찰의 편의를 위해서이다. (유형 변경이 데이터 정밀도 결핍의 영향을 미치는지 결과는 분명하지 않다. 아는 사람이 보면 환영합니다. 감사합니다.)
데이터렌은 우리가 사용해야 할 분당 가장 큰 데이터 길이로 기준의 근거로 쓰인다.DataFrame.groupby.count () 는 각 그룹의 데이터를 각각 표시하는 개수입니다. 몇 개의 그룹이 있는지 표시하는 것이 아닙니다. 그룹을 가져오려면 다음 줄의reset_index 방법, reset_를 직접 사용하지 않는 이유index가 아닌count () 방법에서 호출된 것은 그룹by가 그룹을 나눈 후의 결과가 하나의 DataFrame이 아니기 때문이다.count (count뿐만 아니라 그룹 데이터에 대한 조작 방법은 모두 가능하며 결과가 각 그룹의 index와 일일이 대응하면 된다) 조작을 한 후에 index를 하나의 열로 하고 다른 열은count 결과의 DataFrame를 얻을 수 있기 때문이다.
다음은 직접 reset_index 작업의 오류:

AttributeError: Cannot access callable attribute 'reset_index' of 'DataFrameGroupBy' objects, try using the 'apply' method
다음은 count 작업을 거친 reset_index 방법에 따르면 총 10397조로 나뉜 결과를 볼 수 있다.

   time data
0  25511135 33
1  25511136 18
2  25511137 25
3  25511138 42
4  25511139 36
5  25511140  7
6  25511141 61
7  25511142 45
8  25511143 46
9  25511144 19
10  25511145 21
...   ... ...
10387 25521697  3
10388 25521698  9
10389 25521699 16
10390 25521700 13
10391 25521701  4
10392 25521702 34
10393 25521703 124
10394 25521704 302
10395 25521705 86
10396 25521706 52
 
[10397 rows x 2 columns]
추출된timeseries는 마지막 데이터 통합에 사용됩니다.
지금부터 각 그룹의 데이터를 추출합니다. 먼저 빈 그룹을 만들어서 저장한 다음에 for 순환을 이용하여 각 그룹의 정보를 얻습니다. time는 그룹을 나누는 index이고 그룹은 그룹을 나누는 내용입니다. 데이터를 그룹['data']에서 꺼내서 이전에 만들어진 빈 그룹에 추가합니다. 순환 작업이 끝난 후에 DataFrame으로 전환합니다. 물론 이 DataFrame에는 대량의 부족한 값이 포함되어 있습니다.그것의 열수는 가장 긴 데이터를 기준으로 하기 때문이다.
다음과 같습니다.

   0  1  2  3  ... 1143 1144 1145 1146
0  6522.50 6522.66 6523.79 6523.79 ... NaN NaN NaN NaN
1  6523.95 6524.90 6525.00 6524.35 ... NaN NaN NaN NaN
2  6520.87 6520.00 6520.45 6520.46 ... NaN NaN NaN NaN
3  6516.34 6516.26 6516.21 6516.21 ... NaN NaN NaN NaN
4  6513.28 6514.00 6514.00 6514.00 ... NaN NaN NaN NaN
5  6511.98 6511.98 6511.99 6513.00 ... NaN NaN NaN NaN
6  6511.00 6511.00 6511.00 6511.00 ... NaN NaN NaN NaN
7  6511.70 6511.78 6511.99 6511.99 ... NaN NaN NaN NaN
8  6509.51 6510.00 6510.80 6510.80 ... NaN NaN NaN NaN
9  6511.36 6510.00 6510.00 6510.00 ... NaN NaN NaN NaN
10  6507.00 6507.00 6507.00 6507.00 ... NaN NaN NaN NaN
...  ...  ...  ...  ... ... ... ... ... ...
10386 6333.77 6331.31 6331.30 6333.19 ... NaN NaN NaN NaN
10387 6331.68 6331.30 6331.68  NaN ... NaN NaN NaN NaN
10388 6331.30 6331.30 6331.00 6331.00 ... NaN NaN NaN NaN
10389 6330.93 6330.92 6330.92 6330.93 ... NaN NaN NaN NaN
10390 6330.83 6330.83 6330.90 6330.80 ... NaN NaN NaN NaN
10391 6327.57 6326.00 6326.00 6325.74 ... NaN NaN NaN NaN
10392 6327.57 6329.70 6328.85 6328.85 ... NaN NaN NaN NaN
10393 6323.54 6323.15 6323.15 6322.77 ... NaN NaN NaN NaN
10394 6311.00 6310.83 6310.83 6310.50 ... NaN NaN NaN NaN
10395 6311.45 6311.32 6310.01 6310.01 ... NaN NaN NaN NaN
10396 6310.46 6310.46 6310.56 6311.61 ... NaN NaN NaN NaN
 
[10397 rows x 1147 columns]
줄 수가 그룹 개수이고 총 1147열도 가장 많은 데이터 길이를 볼 수 있다.
이후에 우리는 fillna 방법을 호출하여 부족한 값을 채웁니다. method='ffill'은 부족한 값의 이전 데이터를 근거로 하고axis=1은 행위 단위,limit는 최대 충전 길이를 가리킵니다.최종적으로 우리가 이전에 얻은 timeseries를 마지막 열에 추가하면 수요의 최종 결과를 얻을 수 있다.

   0  1  2  ...  1145  1146  1148
0  6522.50 6522.66 6523.79 ...  6522.14 6522.14 25511135
1  6523.95 6524.90 6525.00 ...  6520.00 6520.00 25511136
2  6520.87 6520.00 6520.45 ...  6517.00 6517.00 25511137
3  6516.34 6516.26 6516.21 ...  6514.00 6514.00 25511138
4  6513.28 6514.00 6514.00 ...  6511.97 6511.97 25511139
5  6511.98 6511.98 6511.99 ...  6511.00 6511.00 25511140
6  6511.00 6511.00 6511.00 ...  6510.90 6510.90 25511141
7  6511.70 6511.78 6511.99 ...  6512.09 6512.09 25511142
8  6509.51 6510.00 6510.80 ...  6512.09 6512.09 25511143
9  6511.36 6510.00 6510.00 ...  6507.04 6507.04 25511144
10  6507.00 6507.00 6507.00 ...  6508.57 6508.57 25511145
11  6507.16 6507.74 6507.74 ...  6506.35 6506.35 25511146
...  ...  ...  ... ...   ...  ...  ...
10388 6331.30 6331.30 6331.00 ...  6331.00 6331.00 25521698
10389 6330.93 6330.92 6330.92 ...  6330.99 6330.99 25521699
10390 6330.83 6330.83 6330.90 ...  6327.58 6327.58 25521700
10391 6327.57 6326.00 6326.00 ...  6325.74 6325.74 25521701
10392 6327.57 6329.70 6328.85 ...  6325.00 6325.00 25521702
10393 6323.54 6323.15 6323.15 ...  6311.00 6311.00 25521703
10394 6311.00 6310.83 6310.83 ...  6315.00 6315.00 25521704
10395 6311.45 6311.32 6310.01 ...  6310.00 6310.00 25521705
10396 6310.46 6310.46 6310.56 ...  6314.04 6314.04 25521706
 
[10397 rows x 1148 columns]
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.만약 잘못이 있거나 완전한 부분을 고려하지 않으신다면 아낌없이 가르침을 주시기 바랍니다.

좋은 웹페이지 즐겨찾기