Случайная выборка на основе даты

#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