如何在Python中将日期时间转换为整数

58

我该如何在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)

请注意大小写敏感性。例如,yY不同。 - i_want_more_edits
8个回答

55

这取决于整数所要编码的内容。你可以将日期转换为相对于某个以前的时间的毫秒数。人们经常将其固定在1970年1月1日或1900年等时间的12:00 am,并将时间表示为该点之后的整数毫秒数。例如,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,以便对它进行的操作以自然的、基于日期的上下文表达,而不是某个孤立开发者的个人hack into an integer。


1
哦!datetime.datetime.now().timestamp() 是一个浮点数,我本来期望得到一个字符串(我很惊讶这里有足够的精度可以成为默认行为,真不错!) - ThorSummoner

26

我想我有一个捷径:

# 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'))

1
这个方法是否考虑了你的时区?我相信它考虑了。如何使它通用? - Akronix
我相信你可以像这里演示的那样(https://dev59.com/fm855IYBdhLWcg3wHwaH)使用**pytz**库来获取你需要的时区。 - Chicrala
2
不确定您所说的“考虑您的时区”是什么意思,但datetime.now()返回本地日期时间。如果您想要UTC日期时间,则可以使用datetime.utcnow()。 - Romain Vincent

9

这是一个示例,可以用于向数据库键提供数据,有时我会使用它来代替使用AUTOINCREMENT选项。

import datetime 

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

6
其他答案都着眼于使用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"

正如接受的答案中所暗示的,仅使用普通数字表示法是不会出错的,而且在处理和分析方面要容易得多,特别是以编程方式处理数据。 转换为可读格式也可以使用简单的一行代码完成。


要在Python中执行相同的操作,可以使用datetime.timestamp()函数,就像djvg评论中提到的那样。 对于其他方法,您可以查看编辑历史记录。


4

这是一个简单的日期到秒数转换工具:

def time_to_int(dateobj):
    total = int(dateobj.strftime('%S'))
    total += int(dateobj.strftime('%M')) * 60
    total += int(dateobj.strftime('%H')) * 60 * 60
    total += (int(dateobj.strftime('%j')) - 1) * 60 * 60 * 24
    total += (int(dateobj.strftime('%Y')) - 1970) * 60 * 60 * 24 * 365
    return total

(实际上是一个UNIX时间戳计算器)

示例用法:

from datetime import datetime
x = datetime(1970, 1, 1)
time_to_int(x)

输出:0

x = datetime(2021, 12, 31)
time_to_int(x)

输出: 1639785600

x = datetime(2022, 1, 1)
time_to_int(x)

输出:1639872000
x = datetime(2022, 1, 2)
time_to_int(x)

输出: 1639958400


2

将日期时间转换为整数时,必须牢记十位、百位和千位……例如 "2018-11-03" 必须像 20181103 一样是整数,因此需要进行以下计算:2018*10000 + 100*11 + 3

同样的例子,"2018-11-03 10:02:05" 必须像 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"))

1
df.Date = df.Date.str.replace('-', '').astype(int)

df是什么?如果它是一个包,请包括它的导入。 - undefined
1
我使用df作为DataFrame(使用pandas库)名称的缩写。Date是您的DataFrame中对应列的名称,您想将其类型从字符串类型更改为整数类型。 - undefined

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接