Расчет кадра данных по строке, но группировка по дате и времени - PullRequest
0 голосов
/ 18 октября 2019

Я манипулирую данными временных рядов с несколькими внутридневными строками в день. Я хочу иметь возможность принимать решения на основе данных, сгруппированных только по дням, но не как .groupby()

В настоящее время я делаю цикл для чего-то вроде np.unique(df.index.date), затем применяю вычисления день ото дня, ноэто занимает много времени на больших наборах данных.

for day in np.unique(df.index.date):
    if df[day.strftime("%Y-%m-%d")].count()[0] != 5:
        df.drop(df[df.index.date == day].index, inplace=True)

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

Date_Time   EB
2018-09-13 9:20:00  69.45
2018-09-13 9:30:00  69.44
2018-09-13 9:40:00  69.33
2018-09-13 9:50:00  69.34
2018-09-13 10:00:00 69.36
2018-09-14 9:20:00  69.45
2018-09-14 9:30:00  69.44
2018-09-14 9:40:00  69.33
2018-09-14 9:50:00  69.34
2018-09-14 10:00:00 69.36

код перебирает каждый день даты-времени и отбрасывает все дни, в которых нет 5 строк.

1 Ответ

2 голосов
/ 18 октября 2019

Я думаю, что вы должны быть в состоянии сделать это без циклов в Python и воспользоваться скоростью уровня C, векторизовав команду. создать серию дат, подсчитать значение, использовать подсчет значений, чтобы пометить данные для хранения и отфильтровать нежелательные данные.

# Make a series to use as a mapping for dates which should be kept
dates_with_more_than_5 = df["Date_Time"].dt.date.value_counts() > 4
# Make a column in the DataFrame which indicates which data to keep
df["keeper_data"] = df["Date_Time"].dt.date.map(dates_with_more_than_5).fillna(False)
# Filter the data and drop the keeper "flag" column
df = df[df["keeper_data"].drop(columns="keeper_data"]

Вы можете сделать это в несколько строк, но это довольно читабельно.

Редактировать: также, я не понимаю, почему это не было бы выполнимо с groupby

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...