问题描述
我的目标是从redshift视图中查询数据,该视图名称由monthdt附加,例如view_name_202009,并逐月查询此视图达13个月,创建数据框并执行转换。创建第一个数据帧( df1)后,应将前几个月的转换后的数据附加到 df1 。
作为逐步方法:
- 查询当月数据框
- 创建数据框(df1)
- 进行转换
- 日期递减至上个月(重复直到13个月后为止)
下面是我编写的用于创建13个月的sql语句的函数,但是我无法将它们以小巧的方式传递给read_sql并创建数据框。
def last_n_months(num_of_months,start_date=datetime.Now(),include_curr=True):
f = "%Y%m"
curr = datetime.Now()
if include_curr:
yield curr.strftime(f)
for num in range(num_of_months):
curr = curr.replace(day=1) - timedelta(days=1)
sql = """select col1,col2,from schema.view_name"""+str(curr.strftime(f))+""" where col1 in ('01','02','1ST','2ND')"""
# df = pd.read_sql(sql,con)
yield sql
m_lst = [sql for sql in last_n_months(13,include_curr=False)]
df = pd.DataFrame()
for i in m_lst:
df = df.append(pd.read_sql(m_lst,con))
我打印出了m_lst,它看起来如下:
["select col1,col2 from schema.view_name_202010 where col1 in ('01','2ND')",["select col1,col2 from schema.view_name_202009 where col1 in ('01',col2 from schema.view_name_202008 where col1 in ('01','2ND')"]
我收到如下错误:
pandas.io.sql.DatabaseError: Execution Failed on sql : argument 1 must be a string or unicode object: got list instead
有人可以帮我解决我做错的地方,如果有更好的方法可以做到这一点?
解决方法
在下面更改此代码
df = pd.DataFrame()
for i in m_lst:
df = df.append(pd.read_sql(i,con))