【问题标题】:Error when combining datetime.date object with datetime.time object将 datetime.date 对象与 datetime.time 对象组合时出错
【发布时间】:2014-06-25 10:29:14
【问题描述】:

我目前正在尝试将 datetime.date 对象与 datetime.time 对象组合以获取生成的 datetime.datetime 样式对象。

我运行 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 结合起来。

【问题讨论】:

  • 你试过datetime.datetime.combine(date_intra, time_intra)吗?

标签: python sql date python-datetime


【解决方案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 列文本附加到该字符串以解析出组合的日期和时间。

【讨论】:

  • 太好了 - 谢谢你们的回答!!我正在从头开始自学这些东西,有时它会融化我的大脑 - 非常感谢您的帮助!
【解决方案2】:

违规行是

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

在这里,您将两个变量 date_intratime_intra 视为函数,并尝试调用它们。去掉括号:

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

【讨论】:

  • 太好了——谢谢你们的回答!!我正在从头开始自学这些东西,有时它会融化我的大脑 - 非常感谢您的帮助!
  • 不客气,请接受两个答案中的任何一个,如果您觉得它们有帮助,请点赞。
猜你喜欢
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多