使用 python 中的日期时间进行操作
Manipulation with datetime in python
我正在 python 开发一个应用程序,我需要计算经过的时间并采取适当的措施。
我有两次默认提供和当前。我想比较与其他时间的差异,它以字符串格式提供。
我试过以下方法:
d1 = datetime.datetime(2015, 1, 21, 9, 54, 54, 340000)
print d1
d2 = datetime.datetime.now()
print d2
print d2 - d1
d3 =datetime.datetime.strptime("22:17:46.476000","%H:%M:%S.%f")
print d3
以上程序的输出是:
2015-01-21 09:54:54.340000
2015-01-21 22:28:45.070000
12:33:50.730000
1900-01-01 22:17:46.476000
这里的时差是'12:33:50.730000',我想和'22:17:46.476000'比较,是字符串。
当我尝试将字符串“22:17:46.476000”转换为时间时,我得到的年份是 1990。我只想要时间为“22:17:46.476000”。所以我可以使用 timedelta 比较这两个时间。
如何去掉 1990-01-01 年。我只想要“22:17:46.476000”。
我尝试使用时间作为 time.strptime("22:17:46.476000","%H:%M:%S.%f")
但它给出的输出为 time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=22, tm_min=17, tm_sec=46, tm_wday=0, tm_yday=1, tm_isdst=-1)
谢谢
给定日期时间 d3
,您可以使用 time
方法获取时间(不带日期):
>>> d3.time()
datetime.time(22, 17, 46, 476000)
然后您可以将这次与 d2.time()
进行比较:
>>> d2.time() > d3.time()
False
或者,您可以使用 combine
从 d2
的日期和 d3
的时间构建日期时间:
import datetime as DT
d1 = DT.datetime(2015, 1, 21, 9, 54, 54, 340000)
d2 = DT.datetime.now()
d3 = DT.datetime.strptime("22:17:46.476000","%H:%M:%S.%f")
d3 = DT.datetime.combine(d2.date(), d3.time())
print(d3)
# 2015-01-21 22:17:46.476000
然后您可以比较两个日期时间:d2
和 d3
。例如:
>>> d2 < d3
True
>>> (d3-d2).total_seconds()
36664.503375
两个 datetime
之间的区别是持续时间表示为 datetime.timedelta
而不是 datetime
,因此您不能使用 strftime
对其进行格式化。
与其使用 strptime
来解析 d3
的值,不如直接构建 datetime.timedelta
。见 documentation for its constructor.
如果您确实需要从字符串中解析 d3
,那么您可以自己解析或使用 python-dateutil 包。
就目前而言,您正在比较两个根本不同的宏伟。
当您从一个 Datetime 对象中减去另一个对象时,您会得到一个 "timedelta" 对象 - 这是一个时间段,可以用天、小时、秒或任何时间单位表示。
另一方面,日期时间对象标记特定的时间点。当您将仅时间字符串解析为 Datetime 时,由于未指定年、月或日,它们将获得默认值 1900-01-01。
因此,由于您要与间隔进行比较的值是一个时间间隔,而不是特定的时间点,因此在比较的另一方面,您应该拥有该值。
最简单的方法就是从你的解析对象中减去 1900-01-01 的午夜 - 然后你有一个 "timedelta" 对象,只有那个持续时间.但是,请注意,这是一个 hack,只要您需要解析的时间间隔大于 24 小时,它就会中断(strptime
当然不会将“30:15:...”解析为1901-01-02 的第 6 小时)
所以,您最好分开并从头开始为您的字符串构建一个 timedelta
对象:
hour, min, sec = "22:17:46.476000".split(":")
d3 = datetime.timedelta(hours=int(hour), minutes=int(minutes), seconds=float(sec))
如果我没理解错的话,22:17:46.476000
代表的不是时间而是时间增量(因为您想将它与另一个时间增量进行比较)。
如果是这样,您真正需要的是从您的字符串构造一个 datetime.timedelta
对象。不幸的是,似乎没有内置的方法可以做到这一点,但是,here您可能会找到一些食谱。
我正在 python 开发一个应用程序,我需要计算经过的时间并采取适当的措施。 我有两次默认提供和当前。我想比较与其他时间的差异,它以字符串格式提供。
我试过以下方法:
d1 = datetime.datetime(2015, 1, 21, 9, 54, 54, 340000)
print d1
d2 = datetime.datetime.now()
print d2
print d2 - d1
d3 =datetime.datetime.strptime("22:17:46.476000","%H:%M:%S.%f")
print d3
以上程序的输出是:
2015-01-21 09:54:54.340000
2015-01-21 22:28:45.070000
12:33:50.730000
1900-01-01 22:17:46.476000
这里的时差是'12:33:50.730000',我想和'22:17:46.476000'比较,是字符串。
当我尝试将字符串“22:17:46.476000”转换为时间时,我得到的年份是 1990。我只想要时间为“22:17:46.476000”。所以我可以使用 timedelta 比较这两个时间。
如何去掉 1990-01-01 年。我只想要“22:17:46.476000”。
我尝试使用时间作为 time.strptime("22:17:46.476000","%H:%M:%S.%f")
但它给出的输出为 time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=22, tm_min=17, tm_sec=46, tm_wday=0, tm_yday=1, tm_isdst=-1)
谢谢
给定日期时间 d3
,您可以使用 time
方法获取时间(不带日期):
>>> d3.time()
datetime.time(22, 17, 46, 476000)
然后您可以将这次与 d2.time()
进行比较:
>>> d2.time() > d3.time()
False
或者,您可以使用 combine
从 d2
的日期和 d3
的时间构建日期时间:
import datetime as DT
d1 = DT.datetime(2015, 1, 21, 9, 54, 54, 340000)
d2 = DT.datetime.now()
d3 = DT.datetime.strptime("22:17:46.476000","%H:%M:%S.%f")
d3 = DT.datetime.combine(d2.date(), d3.time())
print(d3)
# 2015-01-21 22:17:46.476000
然后您可以比较两个日期时间:d2
和 d3
。例如:
>>> d2 < d3
True
>>> (d3-d2).total_seconds()
36664.503375
两个 datetime
之间的区别是持续时间表示为 datetime.timedelta
而不是 datetime
,因此您不能使用 strftime
对其进行格式化。
与其使用 strptime
来解析 d3
的值,不如直接构建 datetime.timedelta
。见 documentation for its constructor.
如果您确实需要从字符串中解析 d3
,那么您可以自己解析或使用 python-dateutil 包。
就目前而言,您正在比较两个根本不同的宏伟。
当您从一个 Datetime 对象中减去另一个对象时,您会得到一个 "timedelta" 对象 - 这是一个时间段,可以用天、小时、秒或任何时间单位表示。
另一方面,日期时间对象标记特定的时间点。当您将仅时间字符串解析为 Datetime 时,由于未指定年、月或日,它们将获得默认值 1900-01-01。
因此,由于您要与间隔进行比较的值是一个时间间隔,而不是特定的时间点,因此在比较的另一方面,您应该拥有该值。
最简单的方法就是从你的解析对象中减去 1900-01-01 的午夜 - 然后你有一个 "timedelta" 对象,只有那个持续时间.但是,请注意,这是一个 hack,只要您需要解析的时间间隔大于 24 小时,它就会中断(strptime
当然不会将“30:15:...”解析为1901-01-02 的第 6 小时)
所以,您最好分开并从头开始为您的字符串构建一个 timedelta
对象:
hour, min, sec = "22:17:46.476000".split(":")
d3 = datetime.timedelta(hours=int(hour), minutes=int(minutes), seconds=float(sec))
如果我没理解错的话,22:17:46.476000
代表的不是时间而是时间增量(因为您想将它与另一个时间增量进行比较)。
如果是这样,您真正需要的是从您的字符串构造一个 datetime.timedelta
对象。不幸的是,似乎没有内置的方法可以做到这一点,但是,here您可能会找到一些食谱。