熊猫数据框和SQL查询

时间:2019-03-15 07:31:01

标签: python sql pandas

我正在尝试将SQL查询转换为熊猫。但是,在尝试了很多之后,我现在脑子里有了个结...

SELECT
 ID, Date1, Date2, Value
FROM
 data t1
WHERE
 t1.ID = 100 AND Date2 BETWEEN '2010-01-01 00:00:00.0' AND '2010-01-31 23:59:59.0' AND t1.Date1 =
 (
  SELECT
   max(t2.Date1)
  FROM
   data t2
  WHERE
   t2.Date1 <= '2010-02-01 00:00:00.0' AND t2.ID = t1.ID AND t2.Date2 = t1.Date2
 ) 
ORDER BY
 t1.Date2

有人有聪明的主意吗?

非常感谢

4 个答案:

答案 0 :(得分:0)

您可以使用read_sql_query方法加载数据。

import pandas as pd


df = pd.read_sql_query(your_sql_statement, your_db_connection)

答案 1 :(得分:0)

谢谢。但这不是我想要的,因为以这种方式查询需要很长时间。我要找的方式应该是

df[(df['Date2'] >= '2010-01-01 00:00:00.0') & (df['Date2'] <= '2010-01-31 23:59:59.0') & ??????????? & df['Date1'] <= '2010-02-01 00:00:00.0' ?????????????

答案 2 :(得分:0)

您没有显示任何示例数据,因此无法轻松检查答案。

查询的内部

 SELECT
   max(t2.Date1)
  FROM
   data t2
  WHERE
   t2.Date1 <= '2010-02-01 00:00:00.0' AND t2.ID = t1.ID AND t2.Date2 = t1.Date2

成为

mask = df.Date1 <= '2010-02-01'
inner = df.loc[mask, :].groupby(['Date2', 'ID'], as_index=False)['Date1'].agg('max')

此DataFrame现在可以与您的初始df一起加入:

mask = (df.ID == 100) & (df.Date2 >= '2010-01-01 00:00:00.0') & (df.Date2 < '2010-01-31 23:59:59.0')
df.loc[mask, ['ID', 'Date2', 'Value']].merge(inner, on=['ID', 'Date2'])

答案 3 :(得分:0)

我正在尝试使用智能逻辑从数据框中过滤数据。

因此,数据框如下所示:

Date1               Date2               Value
01.03.2019 01:00    02.03.2019 00:00    0,824778017
01.03.2019 01:00    03.03.2019 00:00    0,235332219
01.03.2019 01:00    04.03.2019 00:00    0,0545149
01.03.2019 01:00    05.03.2019 00:00    0,088324545
01.03.2019 01:00    06.03.2019 00:00    0,011294991
01.03.2019 19:00    02.03.2019 00:00    0,184424959
01.03.2019 19:00    03.03.2019 00:00    0,610644963
01.03.2019 19:00    04.03.2019 00:00    0,777668521
01.03.2019 19:00    05.03.2019 00:00    0,922268093
01.03.2019 19:00    06.03.2019 00:00    0,654392958
02.03.2019 01:00    03.03.2019 00:00    0,388756252
02.03.2019 01:00    04.03.2019 00:00    0,561393704
02.03.2019 01:00    05.03.2019 00:00    0,761488545
02.03.2019 01:00    06.03.2019 00:00    0,831463861
02.03.2019 01:00    07.03.2019 00:00    0,981502269
02.03.2019 19:00    03.03.2019 00:00    0,277360792
02.03.2019 19:00    04.03.2019 00:00    0,502428364
02.03.2019 19:00    05.03.2019 00:00    0,241836513
02.03.2019 19:00    06.03.2019 00:00    0,118992825
02.03.2019 19:00    07.03.2019 00:00    0,584641587
03.03.2019 01:00    04.03.2019 00:00    0,236813627
03.03.2019 01:00    05.03.2019 00:00    0,53616114
03.03.2019 01:00    06.03.2019 00:00    0,959270138
03.03.2019 01:00    07.03.2019 00:00    0,856270711
03.03.2019 01:00    08.03.2019 00:00    0,537138196
03.03.2019 19:00    04.03.2019 00:00    0,298802098
03.03.2019 19:00    05.03.2019 00:00    0,850840681
03.03.2019 19:00    06.03.2019 00:00    0,268404466
03.03.2019 19:00    07.03.2019 00:00    0,472132954
03.03.2019 19:00    08.03.2019 00:00    0,189761554

我的目标是:

Date202.03.2019 00:00:0007.03.2019 00:00:00之间给出。

首先:对于给定的Date2,重新运行Value,其中Date1是最近的日期

Date1               Date2               Value
01.03.2019 19:00    02.03.2019 00:00    0,184424959
02.03.2019 19:00    03.03.2019 00:00    0,277360792
03.03.2019 19:00    04.03.2019 00:00    0,298802098
03.03.2019 19:00    05.03.2019 00:00    0,850840681
03.03.2019 19:00    06.03.2019 00:00    0,268404466
03.03.2019 19:00    07.03.2019 00:00    0,472132954

第二:对于给定的Date2,返回Value,其中Date1不超过特定日期

Date1               Date2               Value
01.03.2019 19:00    02.03.2019 00:00    0,184424959
02.03.2019 01:00    03.03.2019 00:00    0,388756252
02.03.2019 01:00    04.03.2019 00:00    0,561393704
02.03.2019 01:00    05.03.2019 00:00    0,761488545
02.03.2019 01:00    06.03.2019 00:00    0,831463861
02.03.2019 01:00    07.03.2019 00:00    0,981502269

我的方法是先过滤Date2,然后过滤Date1

is_date2 = (df ['Date2']> = '02.03.2019 00:00:00 ') & (df [' Date2 '] <'07.03.2019 23:59:59')
df = df.loc [is_date2]

is_date1 = (df ['Date1'] <= '07.03.2019 19:00:00 ') & ... ???
df = df.loc [is_date1]

JoergVanAken的回答很有帮助,但尚未达到我的目标。

您还可以将Date1用作预测日期,将Date2用作起息日期

预先感谢