2017-11-07 3 views
1

나는 timeseries 데이터를 조작하기 위해 DatetimeIndex과 함께 팬더 데이터 프레임을 사용하고 있습니다. 데이터는 UTC 시간에 저장되며 보통 (순진한 DatetimeIndex과 함께) 그 방식으로 유지하고 출력에만 시간대를 사용합니다. 세상에는 시간대를 조작하는 것보다 더 혼란 스럽기 때문에 그런 식으로 좋아합니다.재구성 된 팬더 데이터 프레임의 시간대를 변경

In: ts = pd.date_range('2017-01-01 00:00','2017-12-31 23:30',freq='30Min') 
    data = np.random.rand(17520,1) 
    df= pd.DataFrame(data,index=ts,columns = ['data']) 
    df.head() 

Out[15]: 
         data 
2017-01-01 00:00:00 0.697478 
2017-01-01 00:30:00 0.506914 
2017-01-01 01:00:00 0.792484 
2017-01-01 01:30:00 0.043271 
2017-01-01 02:00:00 0.558461 

은 내가 아니에요 경우 열

df.index = [df.index.time,df.index.date] 
df_new = df['data'].unstack() 
In: df_new.head() 
Out : 
      2017-01-01 2017-01-02 2017-01-03 2017-01-04 2017-01-05 \ 
00:00:00 0.697478 0.143626 0.189567 0.061872 0.748223 
00:30:00 0.506914 0.470634 0.430101 0.551144 0.081071 
01:00:00 0.792484 0.045259 0.748604 0.305681 0.333207 
01:30:00 0.043271 0.276888 0.034643 0.413243 0.921668 
02:00:00 0.558461 0.723032 0.293308 0.597601 0.120549 

에 대한 인덱스를 따라 시간과 날짜를 가지고 내가 dataframe을 바꿀 수 있도록 해 매일 시간에 비해 데이터의 도표를 플롯 할 시간대 걱정이 같은 플롯 할 수 있습니다 :

fig, ax = plt.subplots() 
ax.plot(df_new.index,df_new) 

하지만 로컬 시간대의 데이터를 플롯 할 (tz = pytz.timezone('Australia/Sydney'를) 일광 절약 시간에 대한 수당을 만 번 nd 날짜는 더 이상 Timestamp 개체가 아니므로 팬더 시간대 처리를 사용할 수 없습니다. 아니면 내가 할 수 있니? 내가, 내가 수동으로 전환 할 노력하고있어 수없는 가정

(DST 부여는 오전 2시에서 1/10 시작 새벽 2에서 1/4 완료), 그래서 여기까지있어 :

df_new[[c for c in df_new.columns if c >= dt.datetime(2017,4,1) and c <dt.datetime(2017,10,1)]].shift_by(+10) 
df_new[[c for c in df_new.columns if c < dt.datetime(2017,4,1) or c >= dt.datetime(2017,10,1)]].shift_by(+11) 

하지만 기능을 작성하는 방법에 대해서는 확실하지 않습니다. shift_by

+0

IIUC,'df.index = df.index.tz_localize ('UTC') tz_convert ('호주/시드니')'.? –

+0

그게 쉬웠습니다. 나는 적당한 식사를하고 있었다. 고맙습니다. – doctorer

+0

작동하는지 (100 % 확신 할 수는 없지만 스태킹/플로팅을하지 않았 음) 알려 주시면 답변을 게시 해 드리겠습니다. –

답변

2

+ dt.tz_convert 사용 dt.tz_localize 특정 시간대에 dataframe 날짜를 변환 는 (이 적합하지 않은, 제대로 TEH 전환 일에 오전 2시 자정을 처리하지 않습니다,하지만 난 살 수있다). MuliIndex를 만들 때

df.index = df.index.tz_localize('UTC').tz_convert('Australia/Sydney') 
df.index = [df.index.time, df.index.date] 

조금 조심 - 당신이 관찰 한, 중복 타임 스탬프의 두 행을 작성하므로 그런 경우, duplicated으로 제거 :

df = df[~df.index.duplicated()] 
df = df['data'].unstack() 

당신이 할 수있는 또한 와 줄거리를 만들 :

df.plot(subplots=True) 
plt.show() 
관련 문제