2017-01-13 3 views
1

Я совершенно новый с python и борюсь с shift в пандах.Python pandas shift dataframe с индексом времени

Я сравниваю данные, но его нужно сопоставить, чтобы сравнить его. Чтобы выровнять данные, мне нужно только сдвинуть одно из значений индекса данных.

Reference data:      Data to be shifted: 
          acc         acc 
index         index    
1480681219**96**0000000  1   1480681220**04**0000000 8 
1480681220**00**0000000  2   1480681220**08**0000000 9  
1480681220**04**0000000  3   1480681220**12**0000000 7 
1480681220**08**0000000  4   1480681220**16**0000000 10 
1480681220**12**0000000  5   1480681220**20**0000000 6 

(опция полужирного редактирования, похоже, не работает, но я хотел бы выделить те части индексов)

Я хотел бы перенести мой фрейм данных с количеством дополнительного времени, отведенным. Обратите внимание: время в наносекундах. Я понял, что что-то вроде df.shift(2) сдвигает мои данные 2 места, но я хотел бы перенести свои данные с -80000000 наносекунд, который в данном случае 2 места:

Вход:

     acc 
index     
1480681220040000000 8 
1480681220080000000 9 
1480681220120000000 7 
1480681220160000000 10 
1480681220200000000 6 

Желаемый результат:

     acc 
index   
1480681219960000000  8 
1480681220000000000  9   
1480681220040000000  7 
1480681220080000000 10 
1480681220120000000  6 
1480681220160000000 NaN 
1480681220200000000 NaN 

Это меньше масштаб моего кода:

class device_data(object): 
    def __init__(self): 

     _index = [1480681220040000000, 
       1480681220080000000, 
       1480681220120000000, 
       1480681220160000000, 
       1480681220200000000] 

     self.df = pd.DataFrame({'acc': [8, 9, 7, 10, 6], 'index': _index}) 
     self.df = self.df.set_index('index') 

if __name__ == '__main__': 
    extratime = np.int64(-40000000) 

    session = dict() 
    session[2] = {'testnumber': '401', 
       'devicename': 'peanut'} 
    session[2]['data_in_device_class'] = device_data() 

    print session[2]['data_in_device_class'].df 

    if hasattr(session[2]['data_in_device_class'], 'df'): 
     session[2]['data_in_device_class'].df = session[2]['data_in_device_class'].df.shift(int(round(extratime))) 
    else: 
     pass 

    print session[2]['data_in_device_class'].df 

Когда я запустил исходный код, он дал мне эту ошибку: OverflowError: Python int too large to convert to C long

Я использовал extratime = np.int64(extratime) для решения проблемы. Я замечаю, что с уменьшенной версией моего кода это действительно не нужно.

Мой вопрос по-прежнему заключается в том, как я мог бы использовать сдвиг, чтобы переместить мой индекс со значением, а не с количеством мест, которые нужно переместить?

Спасибо

+1

Если вы планируете переложить всю Д.Ф., вы бы лучше 'shift'ing индекс, а затем' 'reindex' или np.roll (DF.index, some_value) 'и использовать возвращаемый массив для' reindex' – EdChum

+0

Когда вы говорите «сдвиг вверх или вниз», вы ожидаете «NaN» сверху или снизу после переключения или хотите усеченный df? – EdChum

+0

@ EdChum: Я понял, что задал неправильный вопрос, поскольку оба ваши ответы были полезными, но это было не то, чего я хотел достичь. Мне стыдно говорить, что мне нужно переписать весь вопрос. Я понял, что на самом деле хочу использовать сдвиг только для сдвига acc, но я бы хотел изменить значение с «exstra time». Я отредактирую свой вопрос так, чтобы он также указывал, что я ищу –

ответ

3

Сначала вы хотите перенести свой индекс на требуемую величину, а затем reindex, чтобы сделать вещи проще я беру copy здесь, сдвигать индекс, и мы reindex на union смещенного индекса и исходного индекса ввести NaN строки:

In [232]: 
df1 = df.copy() 
df1.index -= 80000000 
df1.reindex(df1.index.union(df.index)) 

Out[232]: 
         acc 
index      
1480681219960000000 8.0 
1480681220000000000 9.0 
1480681220040000000 7.0 
1480681220080000000 10.0 
1480681220120000000 6.0 
1480681220160000000 NaN 
1480681220200000000 NaN 
+0

Неужели я здесь? – piRSquared

+0

@piRSquared Я действительно не совсем понимаю, хочет ли OP просто добавить скалярное значение в индекс, как в вашем ответе, 'shift' df вверх/вниз с/без' NaN', поэтому я прокомментировал OP, возможно ваш ответ - это то, что они действительно хотят – EdChum

+0

Я думаю, мы увидим :-) – piRSquared

3

IIUC:
Вы можете просто передать свой индекс с собой добавляется дополнительное время.

Рассмотрим dataframe df как пример

df = pd.DataFrame(np.arange(100).reshape(5, -1)) 
df 

enter image description here

я могу "сдвиг" весь dataframe вниз, как этот

df.index = df.index + 5 
df 

enter image description here


Сообщите мне, если это значение. В противном случае я удалю его.

+0

Я понял, что задал неправильный вопрос, так как оба ваши ответы были полезны, но это было не то, что я хотел выполнить. Мне стыдно говорить, что мне нужно переписать весь вопрос. Я понял, что на самом деле хочу использовать сдвиг только для сдвига acc, но я бы хотел изменить значение с «дополнительным временем». Теперь я отредактировал этот вопрос, и поэтому ваш ответ больше не подходит. Не могли бы вы снять его? Возможно, мне следовало просто удалить весь этот вопрос и начать заново ... –

+0

@ Annemie27 Я бы скопировал то, что у вас есть, и запустил новый вопрос. Оставь старый. Вы можете, или я откажу эти изменения после того, как вы запустили новый вопрос. Таким образом, даже если немного запутать, два ответа могут помочь другим, которые ищут и находят ваш вопрос. И вы также получите еще один вопрос: – piRSquared

+0

@ piRSquared Я думаю, что мне придется переписать старый вопрос и поставить ссылку на этот вопрос здесь, тогда вы можете опубликовать этот ответ там снова? Потому что мой новый отредактированный вопрос был дан. –

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