Передача списка дат Python в SQL-запрос, где предложение - PullRequest
0 голосов
/ 26 мая 2018

У меня есть столбец даты во фрейме данных, который я преобразовываю в список дат

begdtlist = df["BEG_DT"].tolist()

print(begdtlist) возвращает следующее.

Timestamp('2018-04-29 00:00:00'), Timestamp('2018-04-22 00:00:00'), 
Timestamp('2018-04-22 00:00:00'), Timestamp('2018-04-29 00:00:00'), 
Timestamp('2018-04-29 00:00:00'). 

Дата получает тип, приведенный к метке времени.

Я передаю этот список SQL-запросу, как показано ниже

sql = ("select  calndr_dt,wk_of_mnth from DatabaseName where calndr_dt = cast {} as date").format(repr(begdtlist).replace('[','(').replace(']',')'))

Однако мой sql генерируется в следующем формате, что приводит к сбою запроса.

"select  calndr_dt,wk_of_mnth from DatabaseName where calndr_dt = cast 
(Timestamp('2018-04-29 00:00:00'), Timestamp('2018-04-22 00:00:00'), 
Timestamp('2018-04-22 00:00:00'), Timestamp('2018-04-29 00:00:00'), 
Timestamp('2018-04-29 00:00:00')) as date"

Я не уверен, почему это прибывает как Отметка времени.Мне просто нужна часть даты в кавычках.Любое руководство в достижении этого будет оценено.

1 Ответ

0 голосов
/ 26 мая 2018

Вы используете repr() для преобразования объекта в строку.Этот метод не предназначен для случая использования, к которому вы применяете его;он дает информацию о внутреннем представлении базового объекта.

Что вы действительно хотите сделать, это отформатировать вашу метку времени, чтобы сделать ее строкой, которая соответствует вашим потребностям.Как и обычные объекты Python Datetime, объекты pandas 'Timestamp также имеют метод с именем strftime(), используемый для форматирования строк.

# This part is just to create a MWE; it mimics your dataframe that we
# do not have at hand here.
df = pandas.DataFrame({
    'BEG_DT': [
        pandas.Timestamp('2018-04-29'),
        pandas.Timestamp('2019-04-22')]
    })

# This is what you did
begdtlist = df['BEG_DT'].tolist()
print(begdtlist)

# This is how you can format the date according to your needs
for dt in begdtlist:
    print(dt.strftime('%Y-%m-%d'))

Это создает следующий вывод:

[Timestamp('2018-04-29 00:00:00'), Timestamp('2019-04-22 00:00:00')]
2018-04-29
2019-04-22

Вы видите, что форматирование создало строки даты, необходимые для генерации SQL-запроса в строках 2 и 3. Вы можете прочитать о опциях форматирования в официальных документах Python .

Кстати, совершенно нормально, что pandas преобразует ваши даты в свои собственные Timestamp объекты, потому что им требуются интерфейсы для DataFrame взаимодействия и агрегации и т. Д., Которых нет в обычном питоне Date или Datetime объектов.

Тем не менее, вы не можете использовать список в вашем запросе SQL, потому что он сгенерирует неверный синтаксис:

SELECT calndr_dt, wk_of_mnth
FROM databasename
WHERE calendr_dt = CAST 2018-04-29, 2018-04-22 AS DATE
                                  ^
                    this will be your syntax error

Ваш подходВ некоторых случаях есть недостатки:

  1. Вы пытаетесь подключить список к одному вызову CAST, что не удастся
  2. Вы проверяете равенство столбца массиву,который потерпит неудачу

Таким образом, вы также можете прочитать синтаксис SQL и сгенерировать пример запроса перед тем, как попытаться подключить значения через python.

It может выглядеть так ( не проверено - используйте с осторожностью ):

sql = '''
    SELECT calndr_dt, wk_of_mnth
    FROM databasename
    WHERE calendr_dt IN [{:s}]
'''.format(', '.join(
    [
        '\'{:s}\'::DATE'.format(dt.strftime('%Y-%m-%d'))
        for dt in begdtlist
    ]
))

Что приводит к:

SELECT calndr_dt, wk_of_mnth
FROM databasename
WHERE calendr_dt IN ['2018-04-29'::DATE, '2019-04-22'::DATE]
...