2014-10-31 3 views
1

빈도가 1 시간 미만인 데이터 프레임의 시간대를 변경하는 데 문제가 있습니다. 필자의 경우 CSV 소스에서 1 시간에 4 번 데이터 프레임을 얻었으므로 3 월에 DST 시간을 삭제하고 10 월에 DST 시간을 추가해야합니다. freq가 매시간이면 아래의 기능이 잘 작동하지만 freq 미만에서는 작동하지 않습니다.DST 변경을 위해 데이터 프레임의 빈도가 1 시간 미만인 경우 pytz 오류가 발생합니다. [multindex pandas]

다른 사람이이 문제를 해결할 수 있습니까?

import pandas as pd 
import numpy as np 
from pytz import timezone 

def DST_Paris(NH, NH_str): 
    ## Suppose that I do not create the dataframe here but I import one from a CSV file 
    df = pd.DataFrame(np.random.randn(NH * 365), index = pd.date_range(start="01/01/2014", freq=NH_str, periods=NH * 365)) 

    ## I need to delete the hour in March and duplicate the hour in October 
    ## If freq is inf at 1 hour, I need to duplicate all the data inside the considerated hour 

    tz = timezone('Europe/Paris') 
    change_date = tz._utc_transition_times 
    GMT1toGMT2_dates = [datei.date() for datei in list(change_date) if datei.month == 3] 
    GMT2toGMT1_dates = [datei.date() for datei in list(change_date) if datei.month == 10] 
    ind_March = np.logical_and(np.in1d(df.index.date, GMT1toGMT2_dates),(df.index.hour == 2)) 
    ind_October = np.logical_and(np.in1d(df.index.date, GMT2toGMT1_dates),(df.index.hour == 2)) 
    df['ind_March'] = (1-ind_March) 
    df['ind_October'] = ind_October * 1 
    df = df[df.ind_March == 1] 
    df = df.append(df[df.ind_October == 1]) 
    del df['ind_March'] 
    del df['ind_October'] 
    df = df.sort() 

    ## Error if granularity below of 1 hours 
    df = df.tz_localize('Europe/Paris', ambiguous = 'infer') 
    return df 

try: 
    DST_Paris(24, "1h") 
    print "dataframe freq = 1h ==> no pb" 
except: 
    print "dataframe freq = 1h ==> error" 

try: 
    DST_Paris(96, "15min") 
    print "dataframe freq = 15min ==> no pb" 
except: 
    print "dataframe freq = 15min ==> error" 

출력은 다음과 같습니다

dataframe freq = 1h ==> no pb 
dataframe freq = 15min ==> error 

답변

1

해결 방법을 사용하는 것입니다

is_dst = False # or True 
df = df.tz_localize('Europe/Paris', ambiguous=[is_dst]*len(df)) 
모호한 현지 시간은 일광 절약 시간 영역에서 해석 할 필요가있는 경우

명시 적으로 지정 또는 아니. 그런데


,

df['ind_March'] = (1-ind_March) 
df['ind_October'] = ind_October * 1 
df = df[df.ind_March == 1] 
df = df.append(df[df.ind_October == 1]) 
del df['ind_March'] 
del df['ind_October'] 
df = df.sort() 

df = df.loc[(~ind_March) & (ind_October)] 
df = df.sort() 
로 단순화 될 수있다