如何在Python中将时间值添加到日期时间值?

3

我有一个简单的问题(至少我认为是这样),我想在Python中将时间值添加到日期时间值中。这些值从Excel文件中读取。

我有以下代码:

import xlrd
from datetime import time, datetime, timedelta
book = xlrd.open_workbook('C:\\Users\eline\Documents\***\***\Python\Example 1.xlsx')
sh = book.sheet_by_name("test")

arr_time = datetime(*xlrd.xldate_as_tuple(sh.cell_value(1,2), book.datemode))
print(arr_time)

a2 = sh.cell_value(1,5)
# converting float from excel to time value
print(int(a2*24*3600))
x = int(a2*24*3600)
slack_time = time(x//3600, (x%3600)//60, x%60)
print(slack_time)

new_arr_time = arr_time + slack_time
print(new_arr_time)

arr_time是一个日期时间值,可能会有不同的变化,例如:

2016-08-28 13:10:00

slack_time在这里是以分钟(有时是小时)为单位的时间,可以变化,例如:

00:15:00

我希望将松弛时间(例如15分钟)加到arr_time中。因此,对于这个例子,我希望得到以下新的new_arr_time输出:
2016-08-28 13:25:00

然而,当运行我的代码时,出现以下错误:“TypeError: unsupported operand type(s) for +: ‘datetime.datetime’ and ‘datetime.time’”。由此,我理解不能将时间值添加到日期时间值中。但是,当将slack_time转换为日期时间值并将其添加到arr_time中时,我得到了类似的错误(虽然减法可以)。我知道可以使用timedelta(minutes = 15),但由于来自Excel文件的值会变化,有时包含小时,所以这对我不起作用。

因此,我的问题是:如何将从Excel读取的时间值添加到日期时间值中?


1
从文件中读取的 slack_time 值是什么格式?天数吗? - Moses Koledoye
目前它只有时间格式,没有日期。虽然我也尝试过添加日期,但仍然无法正常工作。 - Eline
我指的是你文件中的浮点数。 - Moses Koledoye
很抱歉,我不太明白你的意思,你是指在将其转换为时间之前从Excel中获取的值吗?那个数字是:0.010416666666666666。 - Eline
3个回答

2
import datetime
arr_time = datetime.datetime.strptime('2016-08-28 13:10:00', '%Y-%m-%d %H:%M:%S')
slack_time="00:15:00"
hrs,mts=slack_time.split(":")[:2]
new_time = arr_time + datetime.timedelta(hours=int(hrs),minutes=int(mts))

如果你想要的话,可以从new_time中获取日期的字符串格式。


为什么要使用字符串对象来进行往返转换,当你可以轻松地从浮点数构建timedelta呢? - Moses Koledoye
谢谢你的努力,但我想我会选择第一个答案,因为对我来说更容易阅读。 - Eline

2

您应该将用于构建 slack_time 的浮点值转换为时间间隔,即一个 datetime.timedelta 对象。然后可以将其添加到 datetime 对象中:

>>> x = 0.010416666666666666
>>> timedelta(days=x)
datetime.timedelta(0, 900)
>>> 900/60
15 # the fifteen minutes you had earlier

那么你的代码将变成:

from datetime import datetime, timedelta

new_arr_time = arr_time + timedelta(days=float(sh.cell_value(1,5)))

如果我这样做,会出现一个错误,说“datetime.datetime没有timedelta属性”?你知道为什么会出现这种情况吗?我认为我已经从模块中导入了所有需要的内容。 - Eline
@Eline timedeltadatetime模块中。请查看更新。 - Moses Koledoye
没事了,我已经解决了。我认为这可能有效,尽管我更想直接从Excel中读取值而不是将其转换为时间差,但我不认为这是一个可行的选项。最后,请问一下为什么在时间差中900前面要加0?这与天数有关吗?非常感谢您的时间和努力! - Eline
@Eline 这是 timedelta 的日期部分,而且这不是我放进去的,是 Python 自己加的 :) - Moses Koledoye
啊,我明白了,Python 真是太棒了,哈哈。不过,非常感谢你,这个解决方案易于理解且完美运作! - Eline

0

试试这个 - 希望它能正常工作

d = datetime.datetime.strptime(arr_time, "%Y-%m-%d  %H:%M:%S")
mtime = str(d.hour) + ':' + str(d.minute) + ':' + str(d.second) # Split the time from DateTime and store to a variable named mtime
mdate = str(d.year) + '-' + str(d.month) + '-' + str(d.day) # Store the date into a variable named mdate

timeList = [ mtime, slack_time ]
totalSecs = 0
for tm in timeList:
    timeParts = [int(s) for s in tm.split(':')]
    totalSecs += (timeParts[0] * 60 + timeParts[1]) * 60 + timeParts[2]
totalSecs, sec = divmod(totalSecs, 60)
hr, min = divmod(totalSecs, 60)

ntime = "%d:%02d:%02d" % (hr, min, sec)
print ntime
mergedTime = mdate + ' ' + ntime
print 'Merged Date/Time is: ', mergedTime

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接