Столбец кадра данных маски на основе индекса datetime

Очень похоже на этот вопрос, за исключением того, что мне нужно учитывать как дату, так и время; indexer_between_time, похоже, не поддерживает какие-либо форматы даты и времени, которые я могу найти.

У меня есть фрейм данных dask, который выглядит так:

                     logger_volt        lat     lon
time                                               
2017-01-01 00:01:20      12.0112  37.150902 -98.362
2017-01-01 00:01:40      12.0113  37.150902 -98.362
2017-01-01 00:02:00      12.0057  37.150902 -98.362
2017-01-01 00:02:20      12.0113  37.150902 -98.362
2017-01-01 00:02:40      12.0058  37.150902 -98.362
2017-01-01 00:03:00      12.0113  37.150902 -98.362

И список столбцов, которые нужно замаскировать в определенных временных диапазонах (данные в этих диапазонах считаются «плохими» и вместо этого должны возвращать None) в форме или списке кортежей Python:

[   # var       start of mask           end of mask
    ('lat', '2017-01-01 00:01:40', '2017-01-01 00:02:00'),
    ('lon', '2017-01-01 00:02:40', '2017-01-01 00:03:00'),
]

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

                     logger_volt        lat     lon
time                                               
2017-01-01 00:01:20      12.0112  37.150902 -98.362
2017-01-01 00:01:40      12.0113       None -98.362
2017-01-01 00:02:00      12.0057       None -98.362
2017-01-01 00:02:20      12.0113  37.150902 -98.362
2017-01-01 00:02:40      12.0058  37.150902    None
2017-01-01 00:03:00      12.0113  37.150902    None

Нерабочий код:

dqrs = [   # var       start of mask           end of mask
    ('lat', '2017-01-01 00:01:40', '2017-01-01 00:02:00'),
    ('lon', '2017-01-01 00:02:40', '2017-01-01 00:03:00'),
]
df = xarray.open_dataset('filename.cdf').to_dask_dataframe()

dqr_mask = (df == df) | df.isnull()  # create a dummy mask that's all True
for var, start, end in dqrs:
    dqr_mask |= ((df.columns == var) & (df.index >= start) & (df.index >= end))

df = df.mask(dqr_mask).compute()

Проблемы с другими подходами:

  • Фреймы данных Dask еще не реализуют назначение срезов, поэтому что-то вроде df[start:end] = None для этого не сработает.
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
490
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно выбрать только столбец var из dqr_mask в цикле for, который вы хотите изменить. вот один способ:

dqr_mask = df != df # you want a mask set to False where there is a value
for var, start, end in dqrs:
    #set to True the column var when index is between start and end
    dqr_mask[var] |= (df.index >= start) & (df.index <= end) 
# where dqr_mask False it keeps df otherwise it set the value to None
df = df.mask(dqr_mask,other=None)

print (df)
                    logger_volt      lat     lon
time                                            
2017-01-01 00:01:20     12.0112  37.1509 -98.362
2017-01-01 00:01:40     12.0113     None -98.362
2017-01-01 00:02:00     12.0057     None -98.362
2017-01-01 00:02:20     12.0113  37.1509 -98.362
2017-01-01 00:02:40     12.0058  37.1509    None
2017-01-01 00:03:00     12.0113  37.1509    None

Другие вопросы по теме