我在数据框中有一个日期列,我将其转换为日期列表
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"
我不确定它为什么会作为时间戳出现。我只需要引号中的日期部分。任何指导实现这一点将不胜感激。
答案 0 :(得分:1)
您正在使用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
您会看到格式化已在第2行和第3行中创建了生成SQL查询所需的日期字符串。您可以阅读formatting options in the official python docs。
顺便说一下,pandas
将您的日期转换为自己的Timestamp
对象是完全没问题的,因为它们需要DataFrame
交互和聚合等接口,这些接口不存在在常规python 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
您的方法在几个方面存在缺陷:
CAST
来电,这将失败因此,您可能还想阅读SQL语法并在尝试通过python插入值之前生成示例查询。
可能看起来像这样(未经测试 - 谨慎使用):
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]