如何YYYY-MM-DD hh:mm:ss
在python中将格式转换为整数?例如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)
如何YYYY-MM-DD hh:mm:ss
在python中将格式转换为整数?例如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)
这取决于整数应该编码的内容。您可以将日期转换为以前某个时间的毫秒数。人们经常在 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
,尽可能长时间,以便对它的操作在自然的、基于日期的上下文中表达,而不是某个单独的开发人员个人破解为整数.
我想我有一个捷径:
# 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'))
这在一个可用于例如提供数据库密钥的示例中,我有时使用而不是使用 AUTOINCREMENT 选项。
import datetime
dt = datetime.datetime.now()
seq = int(dt.strftime("%Y%m%d%H%M%S"))
虽然其他答案集中在人类可读的整数表示上int(mydate.strftime("%Y%m%d%H%M%S"))
,但我更喜欢 bashdate
的“自纪元以来的秒数 (1970-01-01 UTC)”。作为参考,您可以使用以下 bash 命令获取1392234674
结果:
date +%s --date="2014-02-12 20:51:14"
正如在接受的答案中所暗示的那样,只是一个普通的整数作为表示是明确的,并且更容易处理和解析,尤其是以编程方式。加上转换是一个简单的单线双向。
要在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)
- datetime(1970, 1, 1)
如果您不需要与 POSIX 时间戳的兼容性,您也可以删除。
将 datetime 转换为整数时,必须牢记数十、数百和数千 .... 像 "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"))