Создать Dataframe с Cx_ Oracle на основе другой даты запроса - PullRequest
0 голосов
/ 25 апреля 2020

Ниже приведен пример таблицы БД.

date          id    name
01.02.11      4     aaaa
21.05.19      5     aaaa
31.12.12      5     aaaa
01.05.15      6     aaaa

. Чтобы правильно запрашивать данные (избегая дубликатов), при запросе я должен установить «отчетную дату», которая является первым днем ​​месяца. .

Приведенный ниже код дает мне запрошенные результаты, но только за один месяц.

sql = 'select * from db where date = '01.03.20''


def oracle(user, pwd, dsn, sql, columns):

    # Connection to databases
    con = cx_Oracle.connect(user=user, password=pwd, dsn=dsn, encoding="UTF-8")
    con.outputtypehandler = OutputHandler

    # Cursor allows Python code to execute PostgreSQL command in a database session
    cur = con.cursor()

    # Check Connection
    print('Connected')

    # Create DF
    df = pd.DataFrame(cur.execute(sql).fetchall(), columns= columns, dtype='object')[:]

    print('Shape:', df.shape)

    return df

Вопрос: Как запросить данные с использованием CX_ Oracle с разными отчетную дату, не делая ее вручную?

Существует несколько способов решить эту проблему напрямую, используя SQL. Однако ожидаемое решение должно использовать «a для l oop».

Я думал об изменении отчетной даты на

for i in [str(i).zfill(2) for i in range(1,13)]: 
    for j in [str(j).zfill(2) for j in range(0,21)]
           sql = f'select * from db where date = '01.{i}.{j}''
  • Например: date = 01.01. 19

Идея состоит в том, чтобы запросить данные за эту дату -> сохранить их в DF

Go до следующего месяца 01.02.19 -> сохранить в DF

И так до тех пор, пока не достигнет диапазона 21 или не достигнет последнего текущего месяца (последняя дата)

Если у кого-то есть идея запросить данные, используя al oop с помощью cx_ Oracle и Pandas за другую дату спасибо за помощь!

1 Ответ

0 голосов
/ 25 апреля 2020

Как насчет чего-то подобного

from datetime import date, datetime, timedelta
import calendar

# Choose Start Month
start_month = date(2019, 1, 1)

# Get Current Month
current_month = date(datetime.today().year, datetime.today().month, 1)

# Create list to collect all successfully run queries
executed_sql_queries = []
# Create list for failed queries
failed_queries = []

# Create list to collect dfs
dfs = []

while start_month <= current_month:
    query_date = start_month.strftime('%d.%m.%y')

    sql = f"""select * from db where date = '{query_date}' """

    try:
        df = oracle(user, pwd, dsn, sql=sql, columns)

    except sql_error as e:
        print(e)
        failed_queries.append(sql)
        pass # move onto the next query or you can try re-running the query

    else:
        executed_sql_queries.append(sql)
        dfs.append(df)

    finally:
        # Add one Month to the date for each run
        days_in_month = calendar.monthrange(start_month.year, start_month.month)[1]
        start_month = start_month + timedelta(days=days_in_month)


all_dfs = pd.concat(dfs)

execute_sql_queries:

["select * from db where date = '01.01.19' ",
 "select * from db where date = '01.02.19' ",
 "select * from db where date = '01.03.19' ",
 "select * from db where date = '01.04.19' ",
 "select * from db where date = '01.05.19' ",
 "select * from db where date = '01.06.19' ",
 "select * from db where date = '01.07.19' ",
 "select * from db where date = '01.08.19' ",
 "select * from db where date = '01.09.19' ",
 "select * from db where date = '01.10.19' ",
 "select * from db where date = '01.11.19' ",
 "select * from db where date = '01.12.19' ",
 "select * from db where date = '01.01.20' ",
 "select * from db where date = '01.02.20' ",
 "select * from db where date = '01.03.20' ",
 "select * from db where date = '01.04.20' "]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...