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

Posted

技术标签:

【中文标题】将自纪元以来的天数转换为日期【英文标题】:Converting days since epoch to date 【发布时间】:2017-02-20 12:20:17 【问题描述】:

如何将表示自纪元 (1970) 以来的天数的序列日期数转换为相应的日期字符串?我已经看到多篇文章展示了如何从字符串到日期编号,但我找不到任何关于如何进行反向操作的文章。

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

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

+ 1 因为无论生成这些日期数字都遵循 1970 年 1 月 1 日 = 1 的约定。)

TL;DR:正在寻找执行以下操作的方法:

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

这与 Python: Converting Epoch time into the datetime 不同,因为我从 1970 年以来的天数开始。由于闰秒等原因,我不确定您是否可以乘以 86,400。

【问题讨论】:

我也愿意接受 bash shell 脚本解决方案。 Python: Converting Epoch time into the datetime的可能重复 使用:datetime.datetime(1970, 1, 1, 0, 0) + datetime.timedelta(15951) 感谢@SSNR - 这行得通:datetime.datetime(1970,1,1) + datetime.timedelta(15951 - 1) 您也可以使用epoch = datetime.datetime.utcfromtimestamp(0) 来获取纪元日期时间,而不是硬编码。然后关注@SSNR 【参考方案1】:

使用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"

【讨论】:

小心使用 -1。这个答案和问题一样,假设第 1 天是 1970-01-01,第 0 天是 1969-12-31。如果您希望 1970-01-01 成为第 0 天,请从函数中删除 -1。 好评@Zonyl。使用 Javas LocalDate (LocalDate.ofEpochDay(15951)) 也会返回 2013-09-03,这可能是你想要的。【参考方案2】:

对于 Pandas 数据框:

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

...假设“日期”列包含像18687 这样的值,即从1970-01-01 的Unix 纪元到2021-03-01 的天数。

还处理自 Unix 纪元以来的秒数和毫秒数,分别使用 unit="s"unit="ms"

另见我的other answer with the exact reverse。

【讨论】:

以上是关于将自纪元以来的天数转换为日期的主要内容,如果未能解决你的问题,请参考以下文章

如何将自纪元以来的 Unix 时间/时间转换为标准日期和时间?

将 Avro 中存储为整数(自 1970 年 1 月 1 日以来的天数)的“日期”转换为雪花“日期”类型

将时代差转换为天数

将 TLE 时间(十进制天数)转换为纪元后的秒数

Perl 将自纪元以来的微秒转换为本地时间

如何从当天的纪元时间获取天数? [复制]