将自纪元以来的天数转换为日期
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。使用 JavasLocalDate
(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 时间/时间转换为标准日期和时间?