如何将timedelta对象转换为datetime对象

42

如何将一个时间差对象(timedelta object)转换成日期时间对象(datetime object)?

我立即想到的是类似 datetime(0)+deltaObj 的方式,但那样并不太好……难道没有一个像 toDateTime() 这样的函数吗?

5个回答

49

将时间差转换为日期时间没有意义,但从初始或起始日期时间中加减时间差是有意义的。

>>> import datetime
>>> today = datetime.datetime.today()
>>> today
datetime.datetime(2010, 3, 9, 18, 25, 19, 474362)
>>> today + datetime.timedelta(days=1)
datetime.datetime(2010, 3, 10, 18, 25, 19, 474362)

20
+1:具有里程碑意义的日期。3月8日是我女儿的生日,比3月9日更具里程碑意义。Unix用户喜欢1970年1月1日,不知道为什么,那不是我女儿的生日。 - S.Lott
4
我试图执行以下操作:period['start_date'] = (self.start_date + timedelta(days=roundtrip_component.day-1)).strftime("%d/%m/%Y"),但出现了错误:TypeError: must be str, not datetime.timedelta。所以我猜在这种情况下将类型timedelta更改为date是有意义的。 - HuLu ViCa
1
将 StartTime 和 EndTime 转换为时间格式非常有意义。它们目前都是时间间隔格式,我正在努力找出为什么和如何将它们转换为时间格式。在 phpmyadmin 中是正常的时间格式,但当我从隧道下载并在 Python 中使用时,它们都是 timedelta 格式,我无法对它们进行任何操作。 - Georgi Ivanov Dimitrov
1
不太有帮助。请勿重新定义问题,然后回答它。我有一个timedelta需要转换为datetime,以便我可以格式化它。 - Bill Gale

2

由于datetime表示一天内的时间,因此您的timedelta应该小于24小时(86400秒),即使timedelta不受此限制。

import datetime

seconds = 86399
td = datetime.timedelta(seconds=seconds)
print(td)
dt = datetime.datetime.strptime(str(td), "%H:%M:%S")
print(dt)

23:59:59
1900-01-01 23:59:59

如果您不想使用默认日期并且知道您的时间差的日期:
date = "05/15/2020"
dt2 = datetime.datetime.strptime("{} {}".format(date, td), "%m/%d/%Y %H:%M:%S")
print(dt2)

2020-05-15 23:59:59

1
我发现可以使用.total_seconds()来创建一个新的时间对象(或者需要时,是一个datetime对象)。
import time
import datetime

start_dt_obj = datetime.datetime.fromtimestamp(start_timestamp)
stop_dt_obj = datetime.datetime.fromtimestamp(stop_timestamp)
delta = stop_dt_obj - start_dt_obj

delta_as_time_obj = time.gmtime(delta.total_seconds())

这允许您做类似以下的事情:
print('The duration was {0}'.format(
    time.strftime('%H:%M', delta_as_time_obj)
)

那是一个时间对象,而不是一个日期时间对象(如所要求的)。 - undefined

0
    import datetime`enter code here
    lastDownloadedDate = datetime.date(2022,8,4)
    print('lastDownloadedDate: ', lastDownloadedDate)
    fdate = lastDownloadedDate + datetime.timedelta(days=1)
    fdate = datetime.datetime.strptime(str(fdate), "%Y-%m-%d")
    fdate = datetime.date(fdate.year, fdate.month, fdate.day)
    print('fdate: ', dt3)`

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

-1

通过在 pandas.DataFrame 中转换一列的示例,改进 @sadpanduar 的 answer

from datetime import timedelta
import time

def seconds_to_datetime(seconds, format='%Y-%m-%d %H:%M:%S'):
    td = timedelta(seconds=seconds)
    time_obj = time.gmtime(td.total_seconds())
    return time.strftime(format, time_obj)

df = pd.read_csv(CSV_PATH)
df['TIMESTAMP_COLUMN'] = df['TIMESTAMP_COLUMN'].apply(seconds_to_datetime)

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