我正在尝试将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
有人有聪明的主意吗?
非常感谢
答案 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
我的目标是:
Date2
在02.03.2019 00:00:00
和07.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
用作起息日期
预先感谢