如何在Python中从毫秒创建日期时间?

225

如何在Python中从毫秒创建一个日期时间?我可以通过java.util.Date(milliseconds)在Java中创建类似的Date对象。

分配一个日期对象并将其初始化为表示自“纪元”即1970年1月1日00:00:00 GMT以来指定的毫秒数。


将Unix时间戳字符串转换为可读日期:Converting unix timestamp string to readable date,因为秒和毫秒之间只是一个因素。 - FObersteiner
5个回答

369

将其转换为时间戳

datetime.datetime.fromtimestamp(ms/1000.0)

31
注意:在Python 3中,(/)执行浮点数除法。若要执行整数除法,请使用(//)。 - John Millikin
5
您实际上希望进行浮点数除法,否则您将失去时间戳小于1秒的任何精度(保存在小数部分中)。最好使用ms/1000.0而不进行截断。 - Brian
4
日期时间肯定是支持的,对吧?如果我们有亚秒级别的精度,抛弃它似乎是不正确的。如果没有,保留原始精度也不会有任何损害。 - Brian
53
为了保持精度而不使用浮点数,您还可以这样做:datetime.utcfromtimestamp(ms//1000).replace(microsecond=ms%1000*1000) - tsg
2
这个解决方案还有另一个问题:“fromtimestamp()可能会引发ValueError,如果时间戳超出平台C localtime()或gmtime()函数支持的值范围。通常情况下,这种限制仅适用于1970年至2038年之间的年份。” - 你的代码预计要持续多久? - mike rodent
显示剩余3条评论

20

这个怎么样?我认为它可以处理1970年之前和2038年之后的日期。

target_datetime_ms = 200000 # or whatever
base_datetime = datetime.datetime(1970, 1, 1)
delta = datetime.timedelta(0, 0, 0, target_datetime_ms)
target_datetime = base_datetime + delta

正如Python标准库中所述:

如果时间戳超出了平台C本地时间(localtime())或世界协调时间(gmtime())函数支持的值范围,fromtimestamp()函数可能会引发ValueError异常。通常这个范围限制在1970年到2038年之间。

很显然,这可以用一行代码完成:

target_dt = datetime(1970, 1, 1) + timedelta(milliseconds=target_dt_ms)

...不仅从我的答案中可以明显看出,而且2015年jfs的评论也非常误导,因为它将变量称为utc_time

不对:它不是“时间”,而是datetime,并且绝对不是UTC。我们关心的datetime是“时区无关”的datetime,而不是时区感知的datetime。因此绝对不是UTC。

如果您对此问题不熟悉,请搜索相关信息。


10
你可以使用utc_time = datetime(1970, 1, 1) + timedelta(milliseconds=millis)来计算UTC时间。 - jfs
@jfs 你的评论是误导性的,而且从我的问题中也很明显。请先阅读我对你评论的回复,然后删除你的评论。 - undefined
你认为datetime.utcfromtimestamp(ts)的结果会是什么? - undefined

20

将毫秒转换为日期时间 (UTC):

import datetime
time_in_millis = 1596542285000
dt = datetime.datetime.fromtimestamp(time_in_millis / 1000.0, tz=datetime.timezone.utc)

2
这将是我接受的答案,因为Java的Date默认也是指UTC时间(与Python中的naive datetime / 未设置tz相比会指向本地时间)。 - FObersteiner

17
import pandas as pd

Date_Time = pd.to_datetime(df.NameOfColumn, unit='ms')

13

使用 pandas 会有一些负担,但是可以工作:

import pandas as pd
pd.to_datetime(msec_from_java, unit='ms').to_pydatetime()

1
这是一种高效的批量转换方法,返回一个 Series 对象。 - StonedTensor

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