marpis
marpis

Reputation: 91

Modify hour in datetimeindex in pandas dataframe

I have a dataframe that looks like this:

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]')

What I need to do is update the hour in the index with the hour in the column but the following approaches don't work:

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

How to proceed?

Upvotes: 2

Views: 2610

Answers (2)

EdChum
EdChum

Reputation: 394129

IIUC I think you want to construct a 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

Just to compare against using 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

You can see that using a TimedeltaIndex is significantly faster

Upvotes: 4

Nader Hisham
Nader Hisham

Reputation: 5414

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')

Upvotes: 0

Related Questions