Python - NumPy.Where со словарем - PullRequest
0 голосов
/ 29 октября 2018

Возможно, я делаю это неправильно, или может быть гораздо лучший способ, чем этот, так как я все еще новичок в Python. Заранее извиняюсь за любые очевидные ошибки.

У меня есть Pandas Dataframe со столбцом STR, который содержит дату и время. Это STR, потому что время отформатировано, что означает, что в день 29 часов. поэтому мы увидим даты, такие как 01 января 2018 года 29:59:59. Как 1 секунда к этому и его 02 / Jan / 2018 06: 00: 00.

Моя цель здесь - преобразовать эти данные в реальное время. Это означает, что любой час между 24 и 29 тоже требует смены даты. Я уже разделил STR на 2 новых столбца ['Dt'] и ['Ti'] из ['Ti'], вытащил час к новой колонке как ['Hr'] и сделал его INT.

Затем я применил pd.to_datetime к ['Dt'] и добавил правило.

df['Dt'] = np.where(df['Hr'] > 23, df['Dt']+pd.DateOffset(1),df['Dt']+pd.DateOffset(0) )

это прекрасно работает.

Теперь мне нужно изменить час на реальное время, например, 24 = 00, 25 = 02 и т. Д.

Я подумал, что лучше всего использовать DICT и отобразить его, поэтому я сделал DICT,

HourMap = {'24':'00','25':'01','26':'02','27':'03','28':'04','29':'05','30':'06'}  

Тогда написал это

df['Hr1'] = np.where(df['Hr'] > 23, df.replace({'Hr':HourMap}),df['Hr'])

Но я получаю "ValueError"

ValueError: operands could not be broadcast together with shapes (273,) (273,29) (273,)

Я посмотрел на эти строки в кадре данных, и они просто обычные INT. При тестировании я могу применить к ним математику (например, df ['Test'] = df ['Hr'] + 1.

Я преобразовал их в STR и попробовал те же правила, но получил ту же ошибку.

Я просто сумасшедший?

Спасибо

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Вы действительно не должны использовать здесь словарь, вам даже не нужен np.where. Используйте оператор по модулю

In [1]: import numpy as np
In [2]: np.arange(31)%24
Out[2]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23,  0,  1,  2,  3,  4,  5, 6], dtype=int32)

У вас есть числа, которые «оборачиваются» на 24, это пример использования учебника для модуля. Таким образом, полный код просто становится:

df['Hr1'] = df['Hr'] % 24

Кроме того, вы можете добавить к своим датам без np.where, просто используя целочисленное деление

df['Dt'] = df['Dt']+pd.DateOffset(Df['Hr']//24)
0 голосов
/ 29 октября 2018

Я считаю, что нужно изменить:

df.replace({'Hr':HourMap})

до map, и если некоторые значения не сопоставлены и возвращены NaN s, замените их на исходные значения на fillna:

df['Hr'].map(HourMap).fillna(df['Hr'])
#alternative solution if performance is not important in large df
#df['Hr'].replace(HourMap)

потому что df.replace возвращает все столбцы DataFrame с замененным столбцом Hr

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...