【问题标题】:How to convert datetime to integer in python如何在python中将日期时间转换为整数
【发布时间】:2015-03-25 02:22:24
【问题描述】:

如何在 python 中将YYYY-MM-DD hh:mm:ss 格式转换为整数? 例如2014-02-12 20:51:14 -> 为整数。

我只知道如何转换hh:mm:ss 不知道yyyy-mm-dd hh:mm:ss

def time_to_num(time_str):
    hh, mm , ss = map(int, time_str.split(':'))
    return ss + 60*(mm + 60*hh)

【问题讨论】:

标签: python datetime integer converters


【解决方案1】:

这取决于整数应该编码的内容。您可以将日期转换为以前某个时间的毫秒数。人们经常在 1970 年 1 月 1 日凌晨 12:00 或 1900 年等时间执行此操作,并将时间测量为从该点开始的整数毫秒数。 datetime 模块(或其他类似模块)将具有为您执行此操作的功能:例如,您可以使用 int(datetime.datetime.utcnow().timestamp())

如果您想对年、月和日进行语义编码,一种方法是将这些组件乘以足够大的数量级值,以将它们并列在整数位内:

2012-06-13 --> 20120613 = 10,000 * (2012) + 100 * (6) + 1*(13)

def to_integer(dt_time):
    return 10000*dt_time.year + 100*dt_time.month + dt_time.day

例如

In [1]: import datetime

In [2]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:def to_integer(dt_time):
:    return 10000*dt_time.year + 100*dt_time.month + dt_time.day
:    # Or take the appropriate chars from a string date representation.
:--

In [3]: to_integer(datetime.date(2012, 6, 13))
Out[3]: 20120613

如果您还需要分钟和秒,则只需根据需要包含更多数量级以显示数字。

我在遗留系统中经常遇到第二种方法,尤其是从遗留 SQL 数据库中提取基于日期的数据的系统。

非常糟糕。您最终会编写大量用于对齐日期、计算月份或日期偏移量的 hacky 代码,因为它们将以整数格式出现(例如,当您经过 12 月时将月份重置回 1,然后增加年份值),以及用于整数格式之间的相互转换。

除非这样的约定存在于您正在处理的 API 的深层、低级且经过全面测试的部分中,否则曾经使用过数据的每个人都可以真正依靠这种整数表示及其所有辅助函数,那么你最终会导致很多人到处重写基本的日期处理例程。

通常最好将值保留在日期上下文中,例如datetime.date,只要您可以,这样对它的操作就可以在自然的、基于日期的上下文中表达,而不是孤立的开发者个人破解成整数。

【讨论】:

  • 哦!, datetime.datetime.now().timestamp() 是一个浮点数,我希望是一个字符串(我很惊讶有足够的精度可以作为默认行为,整洁! )
【解决方案2】:

我想我有一个捷径:

# Importing datetime.
from datetime import datetime

# Creating a datetime object so we can test.
a = datetime.now()

# Converting a to string in the desired format (YYYYMMDD) using strftime
# and then to int.
a = int(a.strftime('%Y%m%d'))

【讨论】:

  • 此方法是否考虑了您的时区?我相信确实如此。如何通用?
  • 我相信您可以像 here 演示的那样得到这个,他们使用 pytz 库来获取您可能需要的时区。
  • 不确定您所说的“考虑到您的时区”是什么意思,但 datetime.now() 返回本地日期时间。如果需要 utc 日期时间,可以使用 datetime.utcnow()。
【解决方案3】:

这在一个示例中可用于提供数据库密钥,我有时会使用而不是使用 AUTOINCREMENT 选项。

import datetime 

dt = datetime.datetime.now()
seq = int(dt.strftime("%Y%m%d%H%M%S"))

【讨论】:

    【解决方案4】:

    虽然其他答案集中在使用 int(mydate.strftime("%Y%m%d%H%M%S"))人类可读整数 表示上,但我更喜欢像 bash date" 自纪元以来的秒数 (1970-01 -01 UTC)"。作为参考,您可以使用以下 bash 命令获取 1392234674 结果:

    date +%s --date="2014-02-12 20:51:14"
    

    作为ely hinted in the accepted answer,只是一个普通整数作为表示是明确的,并且更容易处理和解析,尤其是在编程方面。 Plus 转换是一种简单的双向单线器。

    要在 python 中做同样的事情,你可以使用

    #mydate = datetime.now() #If you want the current time instead
    mydate = datetime(2014,2,12,20,51,14) #your date
    result = (mydate - datetime(1970, 1, 1)).total_seconds()
    #or: result = (mydate - datetime(1970, 1, 1)) / timedelta(seconds=1)
    

    如果您不需要兼容 POSIX 时间戳,也可以删除 - datetime(1970, 1, 1)

    【讨论】:

      【解决方案5】:

      在将日期时间转换为整数时,必须牢记数十、数百和数千......就像 "2018-11-03" 必须像 int 中的 20181103 为此你必须 2018*10000 + 100* 11 + 3

      类似的另一个例子, "2018-11-03 10:02:05" 必须像 int 中的 20181103100205

      解释代码

      dt = datetime(2018,11,3,10,2,5)
      print (dt)
      
      #print (dt.timestamp()) # unix representation ... not useful when converting to int
      
      print (dt.strftime("%Y-%m-%d"))
      print (dt.year*10000 + dt.month* 100  + dt.day)
      print (int(dt.strftime("%Y%m%d")))
      
      print (dt.strftime("%Y-%m-%d %H:%M:%S"))
      print (dt.year*10000000000 + dt.month* 100000000 +dt.day * 1000000 + dt.hour*10000  +  dt.minute*100 + dt.second)
      print (int(dt.strftime("%Y%m%d%H%M%S")))
      

      一般功能

      为了避免手动使用下面的函数

      def datetime_to_int(dt):
          return int(dt.strftime("%Y%m%d%H%M%S"))
      

      【讨论】:

        猜你喜欢
        • 2022-08-20
        • 2012-04-02
        • 1970-01-01
        • 2019-02-16
        • 2019-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多