Обнаружение последовательных отметок времени со всеми строками со значениями NaN в пандах - PullRequest
0 голосов
/ 11 октября 2018

Я хотел бы обнаружить в кадре данных начало и конец (Datetime) последовательных наборов строк со всеми значениями NaN.

Каков наилучший способ сохранить результаты в массивекортежей с началом и концом каждого набора дат и значений NaN?

Например, с использованием приведенного ниже кадра данных, кортеж должен выглядеть следующим образом:

missing_datetimes = [('2018-10-10 22:00:00', '2018-10-11 00:00:00 '),
('2018-10-11 02:00:00','2018-10-11 02:00:00'), ('2018-10-11 04:00:00', '2018-10-11 04:00:00')

Пример кадра данных:

-------------+---------------------+------------+------------+
| geo_id     | Datetime            |  Variable1 |  Variable2 |    
+------------+---------------------+------------+------------+
| 1          | 2018-10-10 18:00:00 |     20     |     10     |
| 2          | 2018-10-10 18:00:00 |     22     |     10     |
| 1          | 2018-10-10 19:00:00 |     20     |     nan    |
| 2          | 2018-10-10 19:00:00 |     21     |     nan    |
| 1          | 2018-10-10 20:00:00 |     30     |     nan    |
| 2          | 2018-10-10 20:00:00 |     30     |     nan    |
| 1          | 2018-10-10 21:00:00 |     nan    |     5      |
| 2          | 2018-10-10 21:00:00 |     nan    |     5      |
| 1          | 2018-10-10 22:00:00 |     nan    |     nan    |
| 1          | 2018-10-10 23:00:00 |     nan    |     nan    |
| 1          | 2018-10-11 00:00:00 |     nan    |     nan    |
| 1          | 2018-10-11 01:00:00 |     5      |     2      |
| 1          | 2018-10-11 02:00:00 |     nan    |     nan    |
| 1          | 2018-10-11 03:00:00 |     2      |     1      |
| 1          | 2018-10-11 04:00:00 |     nan    |     nan    |
+------------+---------------------+------------+------------+

Обновление: А что, если некоторые даты дублируются?

1 Ответ

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

Возможно, вам понадобится groupby с условием

s=df.set_index('Datetime').isnull().all(axis=1)

df.loc[s,'Datetime'].groupby((~s).cumsum()[s]).agg(['first','last']).apply(tuple,1).tolist()
# find the all nan value and if they are consecutive we pull them into one group

Out[89]: 
[('2018-10-1022:00:00', '2018-10-1100:00:00'),
 ('2018-10-1102:00:00', '2018-10-1102:00:00'),
 ('2018-10-1104:00:00', '2018-10-1104:00:00')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...