#python #pandas
#python #панды
Вопрос:
Я пытаюсь выполнить случайную выборку на основе дат, я задавал аналогичный вопрос здесь несколько недель, но у меня возникли проблемы с попыткой преобразовать это в код, чтобы сделать это проще на основе одного и того же n каждый день, в отличие от необходимости выписывать приведенную ниже функцию для каждого дня
df[(df.date <= '2019-01-02') amp; (df.date >= '2019-01-01')].sample(n=3)
df[(df.date <= '2019-01-03') amp; (df.date >= '2019-01-02')].sample(n=3)
но есть ли способ сделать так, чтобы мне не приходилось постоянно записывать даты, например, потому что у меня n = 3 каждый день, я думаю, что должен быть более простой способ сделать это, но я искал везде и не смог понять это. Я почти уверен, что для этого мне нужно использовать lambda, но я не смог полностью разобраться в этом за один день, за исключением:
step=datetime.timedelta(1)
заранее благодарю вас!
date random_sample
2019-01-01 00:03:15 No
2019-01-01 00:06:21 No
2019-01-01 02:00:21 No
2019-01-01 08:06:48 No
2019-01-01 10:25:37 No
2019-01-02 00:03:15 No
2019-01-02 00:06:21 No
2019-01-02 02:00:21 No
2019-01-02 08:06:48 No
2019-01-02 10:25:37 No
date random_sample
2019-01-01 00:03:15 Yes
2019-01-01 00:06:21 No
2019-01-01 02:00:21 Yes
2019-01-01 08:06:48 Yes
2019-01-01 10:25:37 No
2019-01-02 00:03:15 No
2019-01-02 00:06:21 Yes
2019-01-02 02:00:21 Yes
2019-01-02 08:06:48 Yes
2019-01-02 10:25:37 No
Ответ №1:
Вы можете использовать groupby.apply
и взять 3 выборки в каждой группе с одинаковой датой.
Затем вы используете numpy.where
для условного присвоения Yes
дат, которые находятся в вашей выборке:
g = df.groupby(df['date'].dt.date).apply(lambda x: x['date'].sample(n=3)).to_numpy()
df['random_sample'] = np.where(df.date.isin(g), 'Yes', df['random_sample'])
print(df)
date random_sample
0 2019-01-01 00:03:15 Yes
1 2019-01-01 00:06:21 No
2 2019-01-01 02:00:21 No
3 2019-01-01 08:06:48 Yes
4 2019-01-01 10:25:37 Yes
5 2019-01-02 00:03:15 No
6 2019-01-02 00:06:21 Yes
7 2019-01-02 02:00:21 Yes
8 2019-01-02 08:06:48 Yes
9 2019-01-02 10:25:37 No
Редактировать
Фильтруйте данные за две недели до настоящего времени
df = df[df.date >= (pd.to_datetime('today') - pd.Timedelta(days=14))]
Комментарии:
1. привет! большое вам спасибо, это работает действительно хорошо, единственное, что есть в любом случае, чтобы сделать это с запланированной датой начала и окончания, например, в SQL есть функция curdate () , но есть ли похожая функция или что-то в python, чтобы она запускалась и останавливалась в определенный момент?
2. Вы хотите отфильтровать свой набор данных по определенным датам, прежде чем применять выборку?
Curdate
в SQL просто возвращает текущую дату. Мы можем сделать это и на Python. Зависит от того, что вы именно хотите сделать.3. эй, да, я пытаюсь сделать что-то, где это будет похоже на предыдущие 2 недели до последней недели, да, я могу просто отфильтровать заранее, но я не был уверен, возможно ли это или нет?
4. Отредактированный вопрос, который включает фильтрацию данных за две недели @JoeMeyer