Индексирование непрерывных временных рядов из набора данных / массива данных

#python #python-xarray

#python #python-xarray

Вопрос:

Я хочу выбрать данные из моего набора данных для соответствующих значений в моем временном ряду. Даты во временных рядах не являются непрерывными. Итак, я не могу использовать slice с. sel Вот как выглядит индекс моего набора данных

 ds.indexes
>longitude:Float64Index
>time: DatetimeIndex
  

Для фрейма данных Pandas, если бы у меня был индекс, основанный на времени, я мог бы просто использовать индексацию на основе меток, например

 df.loc[['1979-01-09 00:00:00', '1979-01-09 06:00:00']]
  

Индексация Xarray основана на Pandas, но я не знаю, как реализовать описанный выше подход

 ds.var1.loc[['1979-01-09 00:00:00', '1979-01-09 06:00:00']]
>KeyError: "not all values found in index 'time'"
  

Я также пытался:

 ds.var1.sel(dict(time=('1979-01-09 00:00:00', '1979-01-09 06:00:00')))
>TypeError: Cannot convert input [('1979-01-09 00:00:00', '1979-01-09 06:00:00')] of type <class 'tuple'> to Timestamp
  

Было бы здорово узнать, как я могу заставить это работать как с .loc помощью, так и sel с помощью метода

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

1. Один из способов — преобразовать pandas мой массив данных в фрейм данных, а затем использовать df.loc метод работы, но, вероятно, он менее чистый для большого набора данных. Итак, я хотел бы знать, как я могу обойтись исключительно с xarray индексацией.

2. Вы уверены, что индексация фрейма данных, индексируемого DatetimeIndex, работает со списком строк? С pandas 0.24.0 я, кажется, получаю аналогичную ошибку.

3. Да, я проверил еще раз. Он работает с индексацией его как строки в Pandas DataFrame в версии 0.24.2 с использованием .loc

4. Да, будет работать одна строка (хотя это имеет несколько иное значение, чем преобразование строки в объект datetime. Одна строка может представлять диапазон дат; примеры см. В разделе Частичное индексирование строк datetime ). Насколько я знаю, pandas не преобразует автоматически список строк в объекты datetime, как в моем ответе ниже.

5. @spencerkclark В ссылке они не использовали .loc метод. Я снова проверил, индексирование с помощью метода dict не работает для списка строк, но оно работает с использованием .loc метода, если строка точно соответствует символам DatetimeIndex .

Ответ №1:

Я думаю, вам нужно сначала преобразовать строки в объекты datetime. pandas.to_datetime должно сработать:

 import pandas as pd
import xarray as xr

times = pd.date_range('2000-01-01', periods=3, freq='MS')
da = xr.DataArray(range(3), coords=[times], dims=['time'], name='a')
result = da.sel(time=pd.to_datetime(['2000-01-01', '2000-03-01']))
  

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

1. Это не приходило мне в голову, и это было довольно просто, спасибо

2. Не могли бы вы связать меня с кодом sel метода? Я хотел бы узнать, что он делает под капотом. Я попытался найти его на GitHub, но я новичок в этом и не смог его найти

3. Конечно, смотрите здесь .