【问题标题】:Date difference in minutes in PythonPython中以分钟为单位的日期差异
【发布时间】:2011-02-16 20:20:50
【问题描述】:

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

2010-01-01 17:31:22
2010-01-03 17:31:22

【问题讨论】:

  • 不确定是否可行,但您应该更改您接受的答案,因为您选择的答案并非在所有情况下都有效,并且可能会给人们带来问题。

标签: python datetime


【解决方案1】:
minutes_diff = (datetime_end - datetime_start).total_seconds() / 60.0

【讨论】:

  • 伟大而简单的答案;我要补充一点,这是假设 datetime_enddatetime_start 已经解析为 datetime 对象。减法产生一个timedelta 实例。
  • 添加 .dt 对我有用。即minutes_diff = (datetime_end - datetime_start).dt.total_seconds() / 60.0
【解决方案2】:

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

【讨论】:

  • 这对我不起作用,我有两个通常相隔 50-100 秒的值,但是当我使用它时,它会返回一个介于 -17K 到 -18K 范围内的值。知道为什么会这样吗? (除了给定的日期不同之外,我使用的代码与编写的完全一致)。
  • time.mktime() 可能会考虑某些平台上本地 UTC 偏移量的变化(如果输入是不明确的本地时间,例如在 DST 转换结束期间,它也可能会失败)。要在所有平台上获得一致的结果,您可以使用pytz 时区(例如由tzlocal.get_localzone() 调用返回)来了解日期时间对象——以获得正确的经过时间(忽略闰秒)。
  • 谢谢,这很有帮助。老实说,datetime 不是一个非常用户友好的模块
  • 如果 d1 = datetime.strptime('2010-01-01 17:31:22', fmt)d2 = datetime.strptime('2010-01-01 18:31:22', fmt) 给出 0,这将失败,因为没有任何日期差异,只有分钟差异。
【解决方案3】:

如果有人没有意识到,一种方法是结合 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

【讨论】:

【解决方案4】:

用不同的时间日期计算:

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

【讨论】:

  • 这个方法不正确,它忽略了天的差异。
【解决方案5】:

使用@987654321@解析成日期时间实例,然后计算差值,最后将差值转换为分钟。

【讨论】:

    【解决方案6】:

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

    如果两个日期使用相同的 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 偏移量,例如,它有夏令时,那么您应该在找到差异之前将dt1dt2 设置为可感知的日期时间对象,以采取考虑到 UTC 偏移量的可能变化。

    制作感知本地日期时间对象的可移植方法是使用pytz timezones:

    #!/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
    

    如果dt1dt2 对应的时间不明确,则使用默认的is_dst=False 来消除歧义。您可以设置 is_dst=None 以针对不明确或不存在的当地时间引发异常。

    如果您无法安装第 3 方模块,那么 time.mktime() could be used from @Ken Cochrane's answer 可以在某些平台上为某些时区的某些日期找到正确的 utc 偏移量 - 如果您不需要一致(但可能是错误的)结果,那么它比使用天真的 datetime 对象执行 dt2 - dt1 要好得多,如果相应的 utc 偏移量不同,这些对象总是会失败。

    【讨论】:

      【解决方案7】:

      如果您试图找出 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 节,您会看到只读属性只有秒、天和毫秒。这解决了为什么分钟功能不能直接工作的原因。

      【讨论】:

        【解决方案8】:

        就像已经说过的那样,您需要使用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
        

        【讨论】:

          【解决方案9】:

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

          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)
          

          谢谢

          【讨论】:

            【解决方案10】:

            pandas 还有一个偷偷摸摸的方法:

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

            【讨论】:

              【解决方案11】:

              你可以使用 divmod 解决它,

              minutes = divmod((end_date - start_date).total_seconds(), 60)[0]
              

              【讨论】:

                【解决方案12】:
                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
                

                【讨论】:

                • 只有当 2 次是在完全相同的秒(不同的日子)时,这个答案才有效
                猜你喜欢
                • 2021-12-01
                • 1970-01-01
                • 1970-01-01
                • 2012-01-03
                • 1970-01-01
                • 2016-02-09
                • 2021-12-13
                • 1970-01-01
                相关资源
                最近更新 更多