【发布时间】:2021-12-01 13:36:49
【问题描述】:
如何计算 Python 中以下时间戳的时间差(以分钟为单位)?
2010-01-01 17:31:22
2010-01-03 17:31:22
【问题讨论】:
-
不确定是否可行,但您应该更改已接受的答案,因为您选择的答案并非在所有情况下都有效,并且可能会给人们带来麻烦。
如何计算 Python 中以下时间戳的时间差(以分钟为单位)?
2010-01-01 17:31:22
2010-01-03 17:31:22
【问题讨论】:
minutes_diff = (datetime_end - datetime_start).total_seconds() / 60.0
【讨论】:
datetime_end 和 datetime_start 已经被解析为 datetime 对象。减法产生一个 timedelta 实例。
minutes_diff = (datetime_end - datetime_start).dt.total_seconds() / 60.0
RSabet's answer 在日期不完全相同的情况下不起作用。
原问题:
from datetime import datetime
fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 17:31:22', fmt)
d2 = datetime.strptime('2010-01-03 17:31:22', fmt)
daysDiff = (d2-d1).days
print daysDiff
> 2
# Convert days to minutes
minutesDiff = daysDiff * 24 * 60
print minutesDiff
> 2880
d2-d1 给你一个 datetime.timedelta,当你使用天数时,它只会显示 timedelta 中的天数。在这种情况下它工作正常,但如果你有以下内容。
from datetime import datetime
fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 16:31:22', fmt)
d2 = datetime.strptime('2010-01-03 20:15:14', fmt)
daysDiff = (d2-d1).days
print daysDiff
> 2
# Convert days to minutes
minutesDiff = daysDiff * 24 * 60
print minutesDiff
> 2880 # that is wrong
它仍然会给你相同的答案,因为它仍然返回 2 几天;它忽略了 timedelta 中的小时、分钟和秒。
更好的方法是将日期转换为通用格式,然后进行计算。最简单的方法是将它们转换为 Unix 时间戳。这是执行此操作的代码。
from datetime import datetime
import time
fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 17:31:22', fmt)
d2 = datetime.strptime('2010-01-03 20:15:14', fmt)
# Convert to Unix timestamp
d1_ts = time.mktime(d1.timetuple())
d2_ts = time.mktime(d2.timetuple())
# They are now in seconds, subtract and then divide by 60 to get minutes.
print int(d2_ts-d1_ts) / 60
> 3043 # Much better
【讨论】:
time.mktime() 可能会考虑某些平台上本地 utc 偏移量的变化(如果输入是模糊的本地时间,例如在 DST 转换结束期间,它也可能会失败)。要在所有平台上获得一致的结果,您可以使用 pytz 时区(例如 tzlocal.get_localzone() 调用返回的)来了解日期时间对象——以获得正确的经过时间(忽略闰秒)。
d1 = datetime.strptime('2010-01-01 17:31:22', fmt) 和 d2 = datetime.strptime('2010-01-01 18:31:22', fmt) 给出 0,这将失败,因为没有任何天差,只有分钟差。
如果有人没有意识到这一点,一种方法是将 Christophe 和 RSabet 的答案结合起来:
from datetime import datetime
import time
fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 17:31:22', fmt)
d2 = datetime.strptime('2010-01-03 20:15:14', fmt)
diff = d2 -d1
diff_minutes = (diff.days * 24 * 60) + (diff.seconds/60)
print(diff_minutes)
> 3043
【讨论】:
d1 对应的 utc 与 d2 对应的不同,则此方法失败。要考虑 utc 偏移量,请参阅@Ken Cochrane's answer and my comment there 中的解决方案
要使用不同的时间日期进行计算:
from datetime import datetime
fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 16:31:22', fmt)
d2 = datetime.strptime('2010-01-03 20:15:14', fmt)
diff = d2-d1
diff_minutes = diff.seconds/60
【讨论】:
使用@987654321@解析成datetime实例,然后计算差值,最后将差值转换成分钟。
【讨论】:
结果取决于与输入时间字符串对应的时区。
如果两个日期使用相同的 utc 偏移量,最简单的情况是:
#!/usr/bin/env python3
from datetime import datetime, timedelta
time_format = "%Y-%d-%m %H:%M:%S"
dt1 = datetime.strptime("2010-01-01 17:31:22", time_format)
dt2 = datetime.strptime("2010-01-03 17:31:22", time_format)
print((dt2 - dt1) // timedelta(minutes=1)) # minutes
如果你的 Python 版本不支持td // timedelta;将其替换为int(td.total_seconds() // 60)。
如果输入时间在当地时区,在不同时间可能有不同的 utc 偏移量,例如,它有夏令时,那么你应该在发现差异之前将 dt1、dt2 转换为已知的日期时间对象,以考虑utc 偏移量的可能变化。
制作感知本地日期时间对象的可移植方法是使用pytz时区:
#!/usr/bin/env python
from datetime import timedelta
import tzlocal # $ pip install tzlocal
local_tz = tzlocal.get_localzone() # get pytz timezone
aware_dt1, aware_dt2 = map(local_tz.localize, [dt1, dt2])
td = aware_dt2 - aware_dt1 # elapsed time
如果 dt1 或 dt2 对应于不明确的时间,则使用默认的 is_dst=False 来消除歧义。您可以设置 is_dst=None 来为不明确或不存在的当地时间引发异常。
如果你不能安装第 3 方模块,那么 time.mktime() could be used from @Ken Cochrane's answer 可以在某些平台上为某些时区的某些日期找到正确的 utc 偏移量——如果你不需要一致的(但可能是错误的)结果,那么它会好得多而不是使用天真的日期时间对象执行dt2 - dt1,如果相应的 utc 偏移量不同,这些对象总是失败。
【讨论】:
如果您试图找出 pandas 列中时间戳之间的差异,答案很简单。 如果您在几天或几秒钟内需要它,那么
# For difference in days:
df['diff_in_days']=(df['timestamp2'] - df['timestamp1']).dt.days
# For difference in seconds
df['diff_in_seconds']=(df['timestamp2'] - df['timestamp1']).dt.seconds
现在分钟很棘手,因为 dt.minute 仅适用于 datetime64[ns] dtype。 而通过减去两个日期时间生成的列具有格式
AttributeError: 'TimedeltaProperties' object has no attribute 'm8'
所以就像上面很多人提到的那样,你必须在一分钟内得到实际的差异值:
df['diff_in_min']=df['diff_in_seconds']/60
但如果只想要两个时间戳的分钟部分之间的差异,请执行以下操作
#convert the timedelta to datetime and then extract minute
df['diff_in_min']=(pd.to_datetime(df['timestamp2']-df['timestamp1'])).dt.minute
也可以看文章https://docs.python.org/3.4/library/datetime.html 并查看第 8.1.2 节,您会看到只读属性只有秒、天和毫秒。这解决了为什么分钟功能不能直接工作。
【讨论】:
以其他方式获得日期之间的差异;
import dateutil.parser
import datetime
timeDifference = current_date - dateutil.parser.parse(last_sent_date)
time_difference_in_minutes = (int(timeDifference.days) * 24 * 60) + int((timeDifference.seconds) / 60)
谢谢
【讨论】:
正如已经说过的那样,您需要使用datetime.datetime'sstrptime方法:
from datetime import datetime
fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 17:31:22', fmt)
d2 = datetime.strptime('2010-01-03 17:31:22', fmt)
daysDiff = (d2-d1).days
# convert days to minutes
minutesDiff = daysDiff * 24 * 60
print minutesDiff
【讨论】:
pandas 也有偷偷摸摸的方法:
pd.to_timedelta(x) - pd.to_timedelta(y)
【讨论】:
您可以使用 divmod 解决它,
minutes = divmod((end_date - start_date).total_seconds(), 60)[0]
【讨论】:
from datetime import datetime
fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 17:31:22', fmt)
d2 = datetime.strptime('2010-01-03 17:31:22', fmt)
print (d2-d1).days * 24 * 60
【讨论】: