在Python中把Excel时间格式的数字转换成与之对应的字符串

1 人关注

我从一个时间格式为 m/d/yy h:mm 的Excel单元格中提取了数据,数字内容为'1645704206000'。当转换为显示时间的字符串时,它是 2/24/22 12:03

How do I convert this number '1645704206000' to 2/24/22 12:03 using python?

时区是指格林威治时间区。

我正在使用Python 3.9和Excel 2019。

5 个评论
Excel将其日期存储为自1899-12-30以来的浮点天数。
你所举的例子与Excel的自然内部表示法不一致,所以你的问题中缺少一些信息。
FDL
@MarkRansom,对此表示抱歉。我意识到在我把数值键入问题后,时间已经过去了,导致数值不准确。我已经编辑了这个问题。谢谢你。
问问题时经过的少量时间根本就不重要。 你给出的数字太大了。
这是否已经回答了 here 和/或 here ?
python
excel
datetime-format
FDL
FDL
发布于 2022-02-24
2 个回答
TheFaultInOurStars
TheFaultInOurStars
发布于 2022-02-25
已采纳
0 人赞同

Update

datetime 函数上使用 utcfromtimestamp 似乎是错误的(感谢@FObersteiner的评论)。你应该使用 fromtimestamp 来代替。所以你可以用下面的代码来代替底部的代码。请注意, pytz 已被废弃。看来, zoneinfo 可以完成 pytz 的工作。

from datetime import datetime
import pytz
tzHong = pytz.timezone('Hongkong')
tzGMT = pytz.timezone('Etc/GMT')
dateString = "1645704206000"
date = datetime.fromtimestamp(float(dateString)/1000, tz=tzGMT)
print("Date in Hongkong: " + date.astimezone(tz=tzHong).strftime("%m-%d-%y %I:%M"))
print("Date in GMT: " + date.strftime("%m-%d-%y %I:%M"))

Old Version

看起来,问题中存在一个与Excel的自然内部表示法有关的问题。但如果你对将时间戳(含毫秒)转换为字符串、人类可读的日期感兴趣,你可以使用python中的datetime模块。

from datetime import datetime
import pytz
tzHong = pytz.timezone('Hongkong')
tzGMT = pytz.timezone('Etc/GMT')
dateString = "1645704206000"
date = datetime.utcfromtimestamp(float(dateString)/1000)
print("Date in Hongkong: " + date.astimezone(tz=tzHong).strftime("%m-%d-%y %I:%M"))
print("Date in GMT: " + date.astimezone(tz=tzGMT).strftime("%m-%d-%y %I:%M"))

Output

Date in Hongkong: 02-24-22 08:03
Date in GMT: 02-24-22 12:03

还要注意,你所显示的日期(2/24/22 12:03)是在格林威治时间区,而不是香港。这两个时区在上面的代码中都有显示。请确保哪一个适用于你所需的输出。另外,这个答案所提供的答案是12小时的时钟格式。如果你对24小时格式感兴趣,只需将上面代码中的%I改为%H

看来你也需要考虑到一个时区偏移。
@MarkRansom 是的,我也在想这个问题。但由于我不确定OP的时区,所以我更愿意在答案中直接提到这个差异。
FDL
谢谢。时区是在香港时间。
@FObersteiner 谢谢你的说明。既然你已经根据你对我说的话回答了(+1)这个问题,我就不更新答案了。我将在今后的回答中考虑到你的提示。再次感谢:)
@AmirhosseinKiani thanks for coming back to this. Since people tend to just copy&paste code from SO to their own projects without actually reading the answers (+comments), you might want to change datetime.utcfromtimestamp(float(dateString)/1000) to datetime.fromtimestamp(float(dateString)/1000, tz=tzGMT) . Then your code is trap-free :)
FObersteiner
FObersteiner
发布于 2022-02-25
0 人赞同

最新的(Python 3.9以上)版本。

from datetime import datetime, timezone
from zoneinfo import ZoneInfo 
tz_HK = ZoneInfo('Asia/Hong_Kong') # 'Hongkong' just links to 'Asia/Hong_Kong'
unix_ms = "1645704206000"
dt_utc = datetime.fromtimestamp(float(unix_ms)/1000, tz=timezone.utc)
print("date/time in Hongkong: " + dt_utc.astimezone(tz=tz_HK).strftime("%m-%d-%y %I:%M"))