как сделать 'order by' в выражении python eval ()? - PullRequest
0 голосов
/ 10 июля 2019

В моем коде Python у меня есть запрос, я хочу выбрать строки в DataFrame, где указан ID и HOUR <=, но я хочу выбрать только 6 из них. Поэтому я хочу заказать выбор, чтобы избежать выбора слишком много. Я получил ошибку. </p>

ID='IDTET'

t=some timestamp

HistoryThreshold=5

selection=df[df.eval("MY_ID=='%s' and HOUR<='%s' and valid=='%s' ORDER BY HOUR DESC LIMIT '%s'" %(ID,t,'yes',HistoryThreshold+1))]

Я получил ошибку:

  MY_ID =='IDTET'and HOUR <='2019-06-18 08:00:00'and valid =='yes'ORDER BY HOUR DESC LIMIT '6'
    SyntaxError: invalid syntax

Если я сделаю только эту часть, ошибки не будет:

selection=df[df.eval("MY_ID=='%s' and HOUR<='%s' and valid=='%s'"%(ID,t,'yes'))]

1 Ответ

0 голосов
/ 10 июля 2019

Вам не нужно использовать функцию eval для этого.Вы можете использовать маски в Python.Вот как это выглядит:

df = pd.DataFrame({'ID' : [x for x in range(10)], 
                   'Date' : [datetime.strptime('Jun {} 2019'.format(x), '%b %d %Y') 
                             for x in range(1, 11)]})

t = datetime.strptime('Jun 09 2019', '%b %d %Y')
threshold = 5

df[df.Date < t][0:threshold]

   ID       Date
0   0 2019-06-01
1   1 2019-06-02
2   2 2019-06-03
3   3 2019-06-04
4   4 2019-06-05

Если вы хотите, чтобы выбранные строки были самыми близкими к вашей дате ограничения, вы можете отсортировать df по убыванию:

df.sort_values('Date', ascending=False, inplace = True)
df[df.Date < t][0:threshold]

   ID       Date
7   7 2019-06-08
6   6 2019-06-07
5   5 2019-06-06
4   4 2019-06-05
3   3 2019-06-04
...