将日期附加到表名称并迭代创建数据框

问题描述

我的目标是从redshift视图中查询数据,该视图名称由monthdt附加,例如view_name_202009,并逐月查询此视图达13个月,创建数据框并执行转换。创建第一个数据帧( df1)后,应将前几个月的转换后的数据附加到 df1

作为逐步方法

  1. 查询当月数据框
  2. 创建数据框(df1)
  3. 进行转换
  4. 日期递减至上个月(重复直到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))

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...