python中单位转换_关于日期时间:Python中以分钟为单位的日期差异

如何为Python中以下时间戳计算以分钟为单位的时间差?

2010-01-01 17:31:22

2010-01-03 17:31:22

不确定是否有可能,但是您应该更改接受的答案,因为您选择的答案在所有情况下均无效,并且可能会导致人员问题。

如果日期的确切时间不同,RSabet的答案将不起作用。

原始问题:

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

好答案@ken :)

这对我不起作用,我有两个通常相隔50-100秒的值,但是当我使用它时,它返回的值介于-17K到-18K之间。知道为什么会这样吗? (我使用的代码与编写的代码完全相同,只是给定的日期不同)。

time.mktime()可能会考虑某些平台上本地utc偏移量的变化(如果输入是不明确的本地时间(例如在DST结束过渡期间),它可能也会失败。为了在所有平台上获得一致的结果,可以使用pytz时区(例如tzlocal.get_localzone()调用返回)来识别日期时间对象-以获得正确的经过时间(忽略leap秒)。

谢谢,这非常有帮助。老实说,日期时间不是一个非常用户友好的模块

如果d1 = datetime.strptime(2010-01-01 17:31:22, fmt)和d2 = datetime.strptime(2010-01-01 18:31:22, fmt)给出0,则此操作将失败,因为没有任何日差,只有分钟差。

minutes_diff = (datetime_end - datetime_start).total_seconds() / 60.0

简单好回答; Id添加一个警告,它假定datetime_end和datetime_start已被解析为datetime对象。减法生成一个timedelta实例。

如果有人不知道,做到这一点的一种方法是将克里斯托弗和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不同,则此方法失败。要考虑utc偏移量,请参阅@Ken Cochranes答案中的解决方案以及我的评论

使用datetime.strptime()解析为日期时间实例,然后计算差异,最后将差异转换为分钟。

结果取决于与输入时间字符串相对应的时区。

最简单的情况是两个日期都使用相同的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,以针对模棱两可或不存在的本地时间引发异常。

如果您无法安装第三方模块,则可以在@Ken Cochrane的答案中使用time.mktime(),该答案可以在某些时区的某些日期在某些平台上找到正确的utc偏移量-如果您不需要一致的提示(但也许错误的结果),那么它比使用dt2 - dt1处理幼稚的datetime对象要好得多,因为如果相应的utc偏移量不同,该对象总是会失败。

阅读您的答案后,我明白了。太好了!

要使用其他时间日期进行计算:

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

此方法不正确,它忽略了天数差异。

熊猫还有一种偷偷摸摸的方法:

pd.to_timedelta(x) - pd.to_timedelta(y)

以其他方式获取日期之间的差异;

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's strptime方法:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值