2014-10-30 4 views
0

팬더 0.15.0의 index.set_levels 함수로 이상한 관찰을 관찰합니다. 추측과 함께 유럽/파리로 시간대를 변경하면 10 월 2am 시간이 3 배가됩니다.set_levels 함수로 DST 시간 다루기 [multindex pandas]

누구에게이 문제를 해결하기위한 해결책이 있습니까?

array = [('s001', d) for d in pd.date_range(start='01/01/2014', end='01/01/2015', freq='H')] + [('s002', d) for d in pd.date_range(start='01/01/2014', end='01/01/2015', freq='H')] 
index = pd.MultiIndex.from_tuples(array, names=['sce', 'DATES']) 
df = pd.DataFrame(np.random.randn(len(index)), index=index) 
df = df.append(df.query('DATES == "26/10/2014 02:00:00"')) 
df = df.query('DATES <> "30/03/2014 02:00:00"') 
df = df.sort() 
df[7151:7160] 

출력은 : 다음

sce DATES       
s001 2014-10-26 00:00:00 0.342909 
    2014-10-26 01:00:00 -0.575897 
    2014-10-26 02:00:00 -1.469307 <<<< ok 
    2014-10-26 02:00:00 -1.469307 <<<< ok 
    2014-10-26 03:00:00 -1.277365 
    2014-10-26 04:00:00 1.252814 

:

df.index = df.index.set_levels(df.index.get_level_values(1).tz_localize('Europe/Paris', ambiguous = 'infer'), level=1) 
df[7151:7160] 

출력은 : 다음

sce DATES        
s001 2014-10-26 01:00:00+02:00 0.342909 
    2014-10-26 02:00:00+02:00 -0.575897 <<<< nok 
    2014-10-26 02:00:00+01:00 -1.469307 <<<< ok 
    2014-10-26 02:00:00+01:00 -1.469307 <<<< nok 
    2014-10-26 03:00:00+01:00 -1.277365 
    2014-10-26 04:00:00+01:00 1.252814 

경우 I g을 오 간단한 색인을 통해

df = df.reset_index('sce') 
df = df.tz_localize('Europe/Paris', ambiguous = 'infer') 
df = df.set_index('sce', append=True) 
df[7151:7160] 

출력은 다음과 같습니다

DATES      sce   
2014-10-26 00:00:00+02:00 s001 0.342909 <<<< ok 
2014-10-26 01:00:00+02:00 s001 -0.575897 <<<< ok 
2014-10-26 02:00:00+02:00 s001 -1.469307 <<<< ok 
2014-10-26 02:00:00+01:00 s001 -1.469307 <<<< ok 
2014-10-26 03:00:00+01:00 s001 -1.277365 <<<< ok 
2014-10-26 04:00:00+01:00 s001 1.252814 <<<< ok 

두 번째 방법은 좋은 결과를 제공하지만 매우 이상 큰 multiindex의 (날짜 16000 및 SCE 200) dataframe

답변

1
입니다

이것은 버그입니다. 이슈를 참조하십시오. here

작품은 회피 적이므로 레벨 자체가 모호성을 추측하지 못한다는 점에서 버그 일 수 있습니다 ous 시간대를 적절하게 설정하십시오.

In [91]: def works(df): 
    ....:  return df.reset_index(level=1,drop=True).set_index(df.index.get_level_values(1).tz_localize('Europe/Paris', ambiguous = 'infer'),append=True).iloc[7151:7160] 
    ....: 

In [92]: def breaks(df): 
    ....:  return df.set_index(df.index.set_levels(df.index.get_level_values(1).tz_localize('Europe/Paris', ambiguous = 'infer'),level=1)).iloc[7151:7160] 
    ....: 

In [93]: array = [('s001', d) for d in pd.date_range(start='01/01/2014', end='01/01/2015', freq='H')] + [('s002', d) for d in pd.date_range(start='01/01/2014', end='01/01/2015', freq='H')] 

In [94]: index = pd.MultiIndex.from_tuples(array, names=['sce', 'DATES']) 

In [95]: df = pd.DataFrame(np.random.randn(len(index)), index=index) 

In [96]: df = df.append(df.query('DATES == "26/10/2014 02:00:00"')) 

In [97]: df = df.query('DATES <> "30/03/2014 02:00:00"') 

In [98]: df = df.sort() 

In [99]: works(df) 
Out[99]: 
             0 
sce DATES        
s001 2014-10-26 00:00:00+02:00 -0.833819 
    2014-10-26 01:00:00+02:00 -1.190427 
    2014-10-26 02:00:00+02:00 -1.210017 
    2014-10-26 02:00:00+01:00 -1.210017 
    2014-10-26 03:00:00+01:00 0.763599 
    2014-10-26 04:00:00+01:00 -1.055695 
    2014-10-26 05:00:00+01:00 -0.912766 
    2014-10-26 06:00:00+01:00 0.373625 
    2014-10-26 07:00:00+01:00 0.631287 

In [100]: breaks(df) 
Out[100]: 
             0 
sce DATES        
s001 2014-10-26 01:00:00+02:00 -0.833819 
    2014-10-26 02:00:00+02:00 -1.190427 
    2014-10-26 02:00:00+01:00 -1.210017 
    2014-10-26 02:00:00+01:00 -1.210017 
    2014-10-26 03:00:00+01:00 0.763599 
    2014-10-26 04:00:00+01:00 -1.055695 
    2014-10-26 05:00:00+01:00 -0.912766 
    2014-10-26 06:00:00+01:00 0.373625 
    2014-10-26 07:00:00+01:00 0.631287 
+0

나는 0.15.2 :) Thx에 대한 수정을 계획했다. –

+0

예, 우리는 곧 0.15.1을 릴리스 할 예정이므로 다음 릴리스에서 제공 될 예정입니다. 당겨 요청은 환영합니다! – Jeff