2015-09-08 2 views
2

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

master.head(5) 
Out[73]: 
      hour price 
day      
2014-01-01  0 1066.24 
2014-01-01  1 1032.11 
2014-01-01  2 1028.53 
2014-01-01  3 963.57 
2014-01-01  4 890.65 


In [74]: master.index.dtype 

Out[74]: dtype('<M8[ns]') 

Что мне нужно сделать, это обновление час в индексе с час в колонке, но следующие подходы дон» т:

In [82]: master.index.hour = master.index.hour(master['hour']) 

TypeError: 'numpy.ndarray' object is not callable 

In [83]: master.index.hour = [master.index.hour(master.iloc[i,0]) for i in len(master.index.hour)] 

TypeError: 'int' object is not iterable 

Как продолжить?

+0

И каков ваш ожидаемый результат? – styvane

+0

извините, если я не был ясен, то, что предложил EdChum, дает ожидаемый результат – marpis

ответ

3

IIUC Я думаю, что вы хотите построить TimedeltaIndex:

In [89]: 
df.index += pd.TimedeltaIndex(df['hour'], unit='h') 
df 

Out[89]: 
        hour price 
2014-01-01 00:00:00  0 1066.24 
2014-01-01 01:00:00  1 1032.11 
2014-01-01 02:00:00  2 1028.53 
2014-01-01 03:00:00  3 963.57 
2014-01-01 04:00:00  4 890.65 

Просто для сравнения с помощью apply:

In [87]: 
%timeit df.index + pd.TimedeltaIndex(df['hour'], unit='h') 
%timeit df.index + df['hour'].apply(lambda x: pd.Timedelta(x, 'h')) 

1000 loops, best of 3: 291 µs per loop 
1000 loops, best of 3: 1.18 ms per loop 

Вы можете видеть, что использование TimedeltaIndex значительно быстрее

+0

Awesome! Я был у него на час и не смог этого сделать! – marpis

+1

построить Timedeltaindex, будет намного быстрее, выложили тайминги – EdChum

+0

, вам даже не нужно строить конструкцию TimedeltaIndex, просто '' df.index + pd.Timedelta ('1h') '' – Jeff

0
master.index = 
pd.to_datetime(master.index.map(lambda x : x.strftime('%Y-%m-%d')) + '-' + master.hour.map(str) , format='%Y-%m-%d-%H.0') 
+0

неподдерживаемый тип операндов для +: 'Timestamp' и 'str' – marpis

+0

вам может понадобиться преобразовать 'значение 'to' string', проверить обновленный ответ –

+0

Небольшой контекст или объяснение всегда приятное ... – DavidW

Смежные вопросы