Выберите данные в пандах от нескольких конкретных дат - PullRequest
0 голосов
/ 31 октября 2018
dft = pd.DataFrame(randn(100000,1), columns=['A'],
     index=pd.date_range('20130101',periods=100000,freq='T'))

Как видите, я инициализирую Dateframe с '2013-01-01' до '2013-03-11' с 10-минутным интервалом. Как я могу выбрать конкретные данные из конкретных условий?

1) Дата в списке Например: если есть список ['2013-01-02', '2013-01-04', '2013-01-06'] Как я могу выбрать данные на эту дату списка? Или как я могу выбрать данные, которых нет в этой дате списка? В частности, «2013-01-02» означает все данные от «2013-01-02 00:00:00» до «2013-01-02 23:50:00».

2) выбрать несколько ломтиков Например: я хотел бы выбрать данные в несколько слоев, как показано ниже: ['2013-01-02': '2013-01-03'] & ['2013-01-05': '2013-01-07'] & ['2013-01-09': '2013-01- 11' ] В частности, этот фрагмент должен быть таким же, как фрагмент Python, что означает включение слева, но не включение справа.

1 Ответ

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

Предполагая, что это необработанные данные (с индексом Datetime)

dft = pd.DataFrame(np.random.randn(100000,1), columns=['A'],
     index=pd.date_range('20130101',periods=100000,freq='T'))
dft.head()
                            A
2013-01-01 00:00:00  0.313644
2013-01-01 00:01:00  0.458860
2013-01-01 00:02:00  0.841434
2013-01-01 00:03:00 -0.135846
2013-01-01 00:04:00 -0.881316

Для 1), просто используйте .isin()

myDates = ['2013-01-02', '2013-01-04', '2013-01-06']

# to get data in list
df_in = dft[pd.to_datetime(dft.index.date).isin(myDates)]
df_in.head()
                            A
2013-01-02 00:00:00  0.444005
2013-01-02 00:01:00 -0.073561
2013-01-02 00:02:00  0.256737
2013-01-02 00:03:00  1.304807
2013-01-02 00:04:00 -0.741956

# to get data not in list
df_not_in = dft[~pd.to_datetime(dft.index.date).isin(myDates)]
df_not_in_list.head()
                            A
2013-01-01 00:00:00 -0.944070
2013-01-01 00:01:00  0.225456
2013-01-01 00:02:00  0.571424
2013-01-01 00:03:00 -0.004389
2013-01-01 00:04:00  0.933229

Для 2), если я правильно понимаю, вы хотите выбрать данные, используя несколько срезов даты и времени. Для этого вы можете использовать несколько индексных масок из вложенного списка для фильтрации по дате

myDates = [['2013-01-02','2013-01-03'],
           ['2013-01-05','2013-01-07'],
           ['2013-01-09','2013-01-11']]
df_masked = dft[
      (dft.index >= myDates[0][0]) & (dft.index <= myDates[0][1]) & \
      (dft.index >= myDates[1][0]) & (dft.index <= myDates[1][1]) & \
      (dft.index >= myDates[2][0]) & (dft.index <= myDates[2][1])
      ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...