将自纪元以来的天数转换为日期

17

如何将表示自纪元(1970年)以来的天数的序列日期号转换为相应的日期字符串?我看到过多篇帖子展示如何从字符串转换为日期号码,但我没有找到任何有关如何执行反向操作的帖子。

例如,15951 对应于 "2013-09-02"

>>> import datetime
>>> (datetime.datetime(2013, 9, 2) - datetime.datetime(1970,1,1)).days + 1
15951

(因为任何生成这些日期数字的东西都遵循将1970年1月1日视为1的惯例,所以需要加上+ 1。)

TL;DR: 寻找一个能够执行以下操作的工具:

>>> serial_date_to_string(15951)  # arg is number of days since 1970
"2013-09-02"

这与Python:将纪元时间转换为日期时间不同,因为我从1970年开始计算天数。 我不确定是否可以直接乘以86,400,因为存在闰秒等问题。


我也可以接受Bash Shell脚本的解决方案。 - pault
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Cavaz
6
使用:datetime.datetime(1970, 1, 1, 0, 0) + datetime.timedelta(15951) - sisanared
谢谢@SSNR - 这个可以用: datetime.datetime(1970,1,1) + datetime.timedelta(15951 - 1) - pault
2
你也可以使用 epoch = datetime.datetime.utcfromtimestamp(0) 来获取纪元日期时间,而不是硬编码。然后遵循 @SSNR。 - harishankarv
2个回答

25

使用 datetime 包的方法如下:

import datetime
def serial_date_to_string(srl_no):
    new_date = datetime.datetime(1970,1,1,0,0) + datetime.timedelta(srl_no - 1)
    return new_date.strftime("%Y-%m-%d")

这是一个返回所需字符串的函数。

因此:

serial_date_to_string(15951)

返回

>> "2013-09-02"

8
注意这个“-1”。和问题一样,这个答案假设第一天是1970年1月1日,第零天是1969年12月31日。如果你希望1970年1月1日成为第零天,就从函数中删掉“-1”。 - Zonyl
好的评论@Zonyl。使用Java的LocalDate(LocalDate.ofEpochDay(15951))也将返回2013-09-03,这可能是您想要的结果。 - Tobias
我在日期时间炼狱中度过了4个小时,因为pandas的datetimeindex和matplotlib在显示xticks时不太兼容。这个答案是一个很好的解决办法。 - Finncent Price

5

对于Pandas数据框:

df["date"] = pd.to_datetime(df["date"], unit="d")

假设“日期”列包含诸如18687的值,它表示从Unix纪元的1970-01-012021-03-01的天数。

此外,处理Unix纪元以来的秒和毫秒,分别使用unit="s"unit="ms"
还可以查看我的其他答案,进行完全相反的转换

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