Создайте несколько условий OR в пределах l oop для использования в .lo c с datetime.time - PullRequest
1 голос
/ 24 апреля 2020

Предположим, у меня есть следующий DataFrame:

import numpy as np
import pandas as pd
import datetime

index = pd.date_range(start=pd.Timestamp("2020/01/01 08:00"),
             end=pd.Timestamp("2020/04/01 17:00"), freq='5T')

data = {'A': np.random.rand(len(index)),
       'B': np.random.rand(len(index))}

df = pd.DataFrame(data, index=index)

Легко получить доступ каждые 8 ​​утра, скажем, с помощью следующей команды:

eight_am = df.loc[datetime.time(8,0)]

Предположим, теперь я wi sh для доступа каждые 8 ​​утра и каждые 9 утра. Один из способов сделать это - использовать две маски:

mask1 = (df.index.time == datetime.time(8,0))
mask2 = (df.index.time == datetime.time(9,0))

eight_or_nine = df.loc[mask1 | mask2]

Однако моя проблема связана с желанием получить доступ к разному времени дня. Скажем, я sh, чтобы указать это время в списке, скажем

times_to_access = [datetime.time(hr, mins) for hr, mins in zip([8,9,13,17],[0,15,35,0])]

Довольно уродливо создавать переменную маски для каждого раза. Есть ли хороший способ сделать это программно в al oop, или, возможно, есть способ получить доступ к нескольким datetime.time, которые я не вижу?

1 Ответ

1 голос
/ 24 апреля 2020

Использование np.in1d с boolean indexing:

df = df[np.in1d(df.index.time, times_to_access)]
print (df)
                            A         B
2020-01-01 08:00:00  0.904687  0.922797
2020-01-01 09:15:00  0.467908  0.457840
2020-01-01 13:35:00  0.747596  0.534620
2020-01-01 17:00:00  0.559217  0.283298
2020-01-02 08:00:00  0.546884  0.361523
                      ...       ...
2020-03-31 17:00:00  0.541345  0.289005
2020-04-01 08:00:00  0.734592  0.137986
2020-04-01 09:15:00  0.108603  0.955305
2020-04-01 13:35:00  0.109969  0.187756
2020-04-01 17:00:00  0.222852  0.125966

[368 rows x 2 columns]

Pandas возможно только решение с преобразованием индекса в Series, но я думаю медленнее, если большой DataFrame:

df = df[df.index.to_series().dt.time.isin(times_to_access)]
...