Рассчитайте разницу во времени с помощью текста

#python #pandas

Вопрос:

Я хочу рассчитать разницу во времени ,но в содержимом есть текст NaN, можно ли это сделать?

Исходные данные

 TimeStamp   81 1285   82 1285   83 NaN   84 1287   85 1287   86 1287   87 NaN   88 1294   89 1294   90 1294   

ожидаемый

 TimeStamp diff  81 1285 NaN  82 1285 0  83 NaN NaN  84 1287 NaN  85 1287 0  86 1287 0  87 NaN NaN  88 1294 NaN  89 1294 0  90 1294 0  

У меня есть еще один вопрос: добавьте столбец идентификаторов ,рассчитайте разницу во времени на основе категории идентификаторов

Исходные данные

 TimeStamp ID   81 1285 0  82 1285 1  83 NaN 0  84 1287 1  85 1287 0  86 1287 1  87 NaN 0  88 1294 1  89 1294 0  90 1294 1  

ожидаемый

 TimeStamp ID diff  81 1285 0 NaN  82 1285 1 NaN  83 NaN 0 NaN  84 1287 1 2  85 1287 0 NaN  86 1287 1 0  87 NaN 0 NaN  88 1294 1 7  89 1294 0 NaN  90 1294 1 0  

Комментарии:

1. Почему существуют НАНЫ? Можно ли было этого избежать, и если нет, можете ли вы заменить их на 0, чтобы данные все еще что-то значили?

2. Из-за последующей обработки

Ответ №1:

Если ваш столбец или NAN являются строками, просто преобразуйте их в float:

 df['diff'] = df['TimeStamp'].astype(float).diff()  

Выход:

 TimeStamp diff 81 1285 NaN 82 1285 0.0 83 NaN NaN 84 1287 NaN 85 1287 0.0 86 1287 0.0 87 NaN NaN 88 1294 NaN 89 1294 0.0 90 1294 0.0  

Ответ №2:

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

Если вы хотите заменить все NAN в оригинальной серии 0 , вы можете это сделать

 gt;gt;gt; s.fillna(0).diff() 81 NaN 82 0.0 83 -1285.0 84 1287.0 85 0.0 86 0.0 87 -1287.0 88 1294.0 89 0.0 90 0.0 Name: TimeStamp, dtype: float64  

fillna возвращает новую серию, в которой все NAN заменены 0 .

Ответ №3:

Давайте попробуем groupby

 df['new'] = df.groupby(df.TimeStamp.isna().cumsum())['TimeStamp'].diff() df  TimeStamp new 81 1285.0 NaN 82 1285.0 0.0 83 NaN NaN 84 1287.0 NaN 85 1287.0 0.0 86 1287.0 0.0 87 NaN NaN 88 1294.0 NaN 89 1294.0 0.0 90 1294.0 0.0