Как создать новый фрейм данных из SQL-предложения? - PullRequest
0 голосов
/ 03 мая 2018

У меня есть такой фрейм данных. Мы назовем это df1:

  zone          script    datetimecomplete
0   2.0       Consumers 2018-05-03 16:09:48
1   2.0       Inventory 2018-05-03 16:09:48
2   2.0  Orders_Details 2018-05-03 16:09:48
3   3.0       Consumers 2018-05-03 16:09:48
4   3.0       Inventory 2018-05-03 16:09:48
5   3.0  Orders_Details 2018-05-03 16:09:48
6   6.0        Birthday 2018-05-03 16:09:48

Мне нужно создать еще один фрейм данных (df2) на основе df1. Требование заключается в том, что для каждого столбца 'zone' and 'script' мне необходимо сгенерировать количество сценариев за последние 24 часа (нужно сравнивать только дату, а не метки времени). Нужно только добавить строки, где datetimecomplete столбец Сегодня минус 1 день.

df2 должен иметь 4 столбца:

[zone, script, datetimecomplete, totalcount]

зона - такая же, как df1 скрипт - такой же, как df1 datetimecomplete - текущая дата минус 1 день должна быть добавлена ​​в df2 totalcount - необходимо подсчитать каждый отдельный скрипт за последние 24 часа с сегодняшней даты.

Пример df2:

 zone          script    datetimecomplete    totalcount
  2.0       Consumers 2018-05-02 16:09:48     2
  2.0       Inventory 2018-05-02 16:09:48     1
  2.0  Orders_Details 2018-05-02 16:09:48     1
  3.0       Consumers 2018-05-02 16:09:48     1
  3.0       Inventory 2018-05-02 16:09:48     1
  3.0  Orders_Details 2018-05-02 16:09:48     4
  6.0        Birthday 2018-05-02 16:09:48     6

Я не уверен, как это сделать.

Код до сих пор дает мне счетчик, но не за последние 24 часа из df1, и при этом он не создает столбец totalcount:

df2 = df1.groupby(['zone', 'script', df1['datetimecomplete'] - pd.Timedelta(days=1)])['script'].count() 

образец SQL-запроса, который я пытаюсь выполнить:

select df1.zone, df1.script, currentdate - 1 as [datetimecomplete], count(df1.zone) as [TotalCount]

from [df1] as a

where df1.datetimecomplete = currentdate - 1

group by df1.zone, df1.script

Заранее спасибо.

1 Ответ

0 голосов
/ 04 мая 2018

Таким образом, чтобы решить вашу проблему, если я понимаю, вы можете создать mask_24h, чтобы выбрать данные из df1 за последние 24 часа:

h24_ago = (pd.Timestamp.today() - pd.Timedelta(days=1)).date() # time 24h ago
mask_24h = df1['datetimecomplete'] >= h24_ago

Затем для создания df2 вы вправе использовать groupby, но я бы сделал так:

df2 = df1[mask_24h ].groupby(['zone','script']).\
         count().reset_index().rename(columns = {'datetimecomplete':'totalcount'})

здесь вы выбираете данные из df1 в течение последних 24 часов с помощью df1[mask_date], затем вы groupby() на 'zone' и 'script' и продолжаете count(). reset_index() позволяет сохранить другие столбцы и rename() для переименования. Теперь вы просто пропускаете столбец 'datetimecomplete', поэтому сделайте:

df2['datetimecomplete'] = h24_ago

Надеюсь, что это работает

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