在结合datetime.date对象和datetime.time对象时出错

0 投票
2 回答
3392 浏览
提问于 2025-04-18 11:00

我现在正在尝试把一个日期对象和一个时间对象结合起来,想得到一个日期时间对象。

我运行了一个SQL查询,然后通过以下方式解析结果:

import sqlite3
import time
import datetime

conn = sqlite3.connect('stu.sqlite3', detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
cur = conn.cursor()
cur.execute('SELECT intra_day.date, intra_day.time, intra_day.price, closing_price.date, closing_price.cprice FROM intra_day, closing_price WHERE intra_day.date = closing_price.date')

for row in cur:
    date_intra, time_intra, price_intra, cp_date, cprice = (row[0], row[1], float(row[2]), row[3], float(row[4]))
    date_intra = datetime.datetime.strptime(date_intra, '%d/%m/%Y %H:%M:%S').date()
    time_intra = datetime.datetime.strptime(time_intra, '%H:%M:%S').time()
    cp_date = datetime.datetime.strptime(cp_date, '%d/%m/%Y %H:%M:%S').date()

当这个运行完后,我在IDLE中检查类型并打印测试,得到了以下结果:

type(date_intra)
Out[2]: datetime.date

type(time_intra)
Out[3]: datetime.time

type(cp_date)
Out[4]: datetime.date

print date_intra, time_intra, price_intra, cp_date, cprice
2008-07-07 05:40:00 1265.5 2008-07-07 1251.75

date_intra, time_intra, price_intra, cp_date, cprice
Out[13]: 
(datetime.date(2008, 7, 7),
 datetime.time(5, 40),
 1265.5,
 datetime.date(2008, 7, 7),
 1251.75)

从这个结果来看,我应该能够使用:

datetime.datetime.combine(date_intra(), time_intra())

来把日期对象和时间对象结合起来,但我却遇到了以下错误:

TypeError: 'datetime.date' object is not callable 

因为我对Python不太熟悉,我还尝试了:

datetime.datetime.combine(datetime.date(date_intra), datetime.time(time_intra))

但又得到了以下错误:

TypeError: an integer is required 

有没有人能告诉我我哪里做错了,或者帮我纠正一下?

一旦我把这两个(date_intra和time_intra)结合起来,我还想把cp_date和time_intra结合在一起。

2 个回答

1

出问题的那一行是

datetime.datetime.combine(date_intra(), time_intra())

在这里,你把两个变量 date_intratime_intra 当成了函数来用,试图去 调用 它们。你需要去掉括号:

>>> datetime.datetime.combine(date_intra, time_intra)
datetime.datetime(2008, 7, 7, 5, 40)
1

你直接传入日期和时间对象:

datetime.datetime.combine(date_intra, time_intra)

这些对象已经是 datetime.combine() 所需要的正确类型;你不需要再调用它们或者再转换成正确的类型。

示例:

>>> import datetime
>>> date_intra = datetime.date(2008, 7, 7)
>>> time_intra = datetime.time(5, 40)
>>> datetime.datetime.combine(date_intra, time_intra)
datetime.datetime(2008, 7, 7, 5, 40)

你可以一步到位地解析时间和日期:

date_intra, time_intra, price_intra, cp_date, cprice = (row[0], row[1], float(row[2]), row[3], float(row[4]))
intra = datetime.datetime.strptime(
    '{} {}'.format(date_intra.partition(' ')[0], time_intra),
    '%d/%m/%Y %H:%M:%S')

这段代码会取出 date_intra 字符串中的日期部分(也就是第一个空格之前的内容),然后把 time_intra 列的文本加到这个日期后面,从而解析出一个组合的日期和时间。

撰写回答