Squeak.ru - шаблоны программирования

Подмножество данных выбранных дней в Python

У меня есть некоторые данные временных рядов:

import pandas as pd    
index = pd.date_range('06/01/2014',periods=24*30,freq='H')
df1 = pd.DataFrame(range(len(index)),index=index)

Теперь я хочу подмножить данные следующих дат

selec_dates = ['2014-06-10','2014-06-15','2014-06-20']

Я пробовал следующее утверждение, но оно не работает

sub_data = df1.loc[df1.index.isin(pd.to_datetime(selec_dates))]

Где я делаю неправильно? Есть ли другой подход к подмножеству данных о выбранных днях?


  • @chuckm он использует pd.to_datetime 12.05.2017

Ответы:


1

Вы можете использовать метод .query(). :

In [202]: df1.query('@index.normalize() in @selec_dates')
Out[202]:
                       0
2014-06-10 00:00:00  216
2014-06-10 01:00:00  217
2014-06-10 02:00:00  218
2014-06-10 03:00:00  219
2014-06-10 04:00:00  220
2014-06-10 05:00:00  221
2014-06-10 06:00:00  222
2014-06-10 07:00:00  223
2014-06-10 08:00:00  224
2014-06-10 09:00:00  225
...                  ...
2014-06-20 14:00:00  470
2014-06-20 15:00:00  471
2014-06-20 16:00:00  472
2014-06-20 17:00:00  473
2014-06-20 18:00:00  474
2014-06-20 19:00:00  475
2014-06-20 20:00:00  476
2014-06-20 21:00:00  477
2014-06-20 22:00:00  478
2014-06-20 23:00:00  479

[72 rows x 1 columns]
12.05.2017

2

Вам нужно сравнить dates и для тестового членства использовать numpy.in1d:

sub_data = df1.loc[np.in1d(df1.index.date, pd.to_datetime(selec_dates).date)]
print (sub_data)
                      a
2014-06-10 00:00:00  216
2014-06-10 01:00:00  217
2014-06-10 02:00:00  218
2014-06-10 03:00:00  219
2014-06-10 04:00:00  220
2014-06-10 05:00:00  221
2014-06-10 06:00:00  222
2014-06-10 07:00:00  223
2014-06-10 08:00:00  224
2014-06-10 09:00:00  225
2014-06-10 10:00:00  226
...

Если хотите использовать isin, необходимо создать Series с таким же индексом:

sub_data = df1.loc[pd.Series(df1.index.date, index=df1.index)
                     .isin(pd.to_datetime(selec_dates).date)]
print (sub_data)
                       a
2014-06-10 00:00:00  216
2014-06-10 01:00:00  217
2014-06-10 02:00:00  218
2014-06-10 03:00:00  219
2014-06-10 04:00:00  220
2014-06-10 05:00:00  221
2014-06-10 06:00:00  222
2014-06-10 07:00:00  223
2014-06-10 08:00:00  224
2014-06-10 09:00:00  225
2014-06-10 10:00:00  226
2014-06-10 11:00:00  227
...
12.05.2017

3

Я извиняюсь и неправильно понял ваш вопрос

df1[pd.Series(df1.index.date, index=df1.index).isin(pd.to_datetime(selec_dates).date)]

Должен выполнить то, что было необходимо

оригинальный ответ

Ознакомьтесь с pandas документацией по выбору.

Вы можете легко сделать

sub_data = df1.loc[pd.to_datetime(selec_dates)]
12.05.2017
  • Супер удобно @MaartenFabre 12.05.2017
  • Это дает только первое наблюдение за выбранный день. Мне нужны все 24 наблюдения выбранных дней 12.05.2017
  • действительно @jezrael. Я начал редактирование до того, как увидел ваш ответ 12.05.2017
  • Хорошо, без проблем, добрый день! 12.05.2017
  • пс. ты использовал .loc, а я нет 12.05.2017

  • 4

    Изменить: мне сообщили, что это работает, только если вы работаете с диапазоном дат в том же месяце и году, что и в вашем запросе. Более общий (и лучший ответ) см. в решении @jezrael.

    Вы можете использовать np.in1d и .day в своем индексе, если хотите сделать это так, как пытались:

    selec_dates = ['2014-06-10','2014-06-15','2014-06-20']
    
    df1.loc[np.in1d(df1.index.day, (pd.to_datetime(selec_dates).day))]
    

    Это дает вам, как вам нужно:

    2014-06-10 00:00:00  216
    2014-06-10 01:00:00  217
    2014-06-10 02:00:00  218
    2014-06-10 03:00:00  219
    2014-06-10 04:00:00  220
    2014-06-10 05:00:00  221
    2014-06-10 06:00:00  222
    2014-06-10 07:00:00  223
    2014-06-10 08:00:00  224
    2014-06-10 09:00:00  225
    2014-06-10 10:00:00  226
    2014-06-10 11:00:00  227
    2014-06-10 12:00:00  228
    2014-06-10 13:00:00  229
    2014-06-10 14:00:00  230
    2014-06-10 15:00:00  231
    2014-06-10 16:00:00  232
    2014-06-10 17:00:00  233
    2014-06-10 18:00:00  234
    2014-06-10 19:00:00  235
    2014-06-10 20:00:00  236
    2014-06-10 21:00:00  237
    2014-06-10 22:00:00  238
    2014-06-10 23:00:00  239
    2014-06-15 00:00:00  336
    2014-06-15 01:00:00  337
    2014-06-15 02:00:00  338
    2014-06-15 03:00:00  339
    2014-06-15 04:00:00  340
    2014-06-15 05:00:00  341
                     ...
    2014-06-15 18:00:00  354
    2014-06-15 19:00:00  355
    2014-06-15 20:00:00  356
    2014-06-15 21:00:00  357
    2014-06-15 22:00:00  358
    2014-06-15 23:00:00  359
    2014-06-20 00:00:00  456
    2014-06-20 01:00:00  457
    2014-06-20 02:00:00  458
    2014-06-20 03:00:00  459
    2014-06-20 04:00:00  460
    2014-06-20 05:00:00  461
    2014-06-20 06:00:00  462
    2014-06-20 07:00:00  463
    2014-06-20 08:00:00  464
    2014-06-20 09:00:00  465
    2014-06-20 10:00:00  466
    2014-06-20 11:00:00  467
    2014-06-20 12:00:00  468
    2014-06-20 13:00:00  469
    2014-06-20 14:00:00  470
    2014-06-20 15:00:00  471
    2014-06-20 16:00:00  472
    2014-06-20 17:00:00  473
    2014-06-20 18:00:00  474
    2014-06-20 19:00:00  475
    2014-06-20 20:00:00  476
    2014-06-20 21:00:00  477
    2014-06-20 22:00:00  478
    2014-06-20 23:00:00  479
    
    [72 rows x 1 columns]
    

    Я использовал эти источники для этого ответа:
    - Выбор подмножества Pandas DataFrame, проиндексированного DatetimeIndex, со списком TimeStamps
    - В Python-Pandas, как я могу подмножить фрейм данных по определенным значениям индекса даты и времени?
    - вернуть панды Столбец DF с количеством дней, прошедших между индексом и сегодняшней датой
    - Получить день недели/день недели для столбца Datetime в DataFrame
    - https://stackoverflow.com/a/36893416/2254228

    12.05.2017
  • @jezrael Вы можете видеть, что я использовал .day, а вы использовали .date Искренне не видели, что вы опубликовали, когда я изменил ответ. Просто не хочу, чтобы вы думали, что я попытаюсь сказать, что ваше превосходство принадлежит мне, не предоставив источник! :) Извините за путаницу. 12.05.2017
  • @jezrael Я думаю, что это работает, потому что год и месяц одинаковы, поскольку меняется только дата (и все ли его индексы в том же месяце/годе). Если бы в selec_dates были разные дни в разные месяцы или разные годы, это было бы неправильно. Имеет ли это смысл? Однако, как обычно, ваш ответ намного лучше для общего случая любой возможной даты! 12.05.2017
  • И поздравляю с 1к ;) 12.05.2017
  • @jezrael !! :D :D Наконец-то я добрался, ха-ха. Спасибо, что поздравили! ;) 12.05.2017

  • 5

    Используйте строковое представление даты, исключая периоды времени в дне.

    pd.concat([df1['2014-06-10'] , df1['2014-06-15'], df1['2014-06-20']])
    
    12.05.2017
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...