如何将整数日期格式转换为YYYYMMDD?

19
Python和Matlab经常使用以下方式表示整数日期:
733828.0
733829.0
733832.0
733833.0
733834.0
733835.0
733836.0
733839.0
733840.0
733841.0

这些数字对应今年的一些日期。你知道哪个函数可以将它们转换回YYYYMMDD格式吗?
4个回答

20

你可以使用datetime.datetime来解决这个问题。如果这些值被视为整数天(你没有指定它们是什么),则以下方法可行。

>>> from datetime import datetime
>>> dt = datetime.fromordinal(733828)
>>> dt
datetime.datetime(2010, 2, 25, 0, 0)
>>> dt.strftime('%Y%m%d')
'20100225'

您正在显示浮点数值,但上述函数不支持浮点数。如果您能提供有关数据的更多详细信息(以及其来源),则可以给出更完整的答案。


请参考Toby Fernsler的回答。他提到了Rata Die,这可能解释了OP所处理的内容(不幸的是,OP从未澄清过这一点)。如果这些值实际上是Rata Die,则我上面的代码将产生错误的结果,因为Python的序数日期与Rata Die不同。 - Peter Hansen
为什么要使用datetime.fromordinal()而不是date.fromordinal()?我们只处理日期,对吧? - MichielB
@MichielB 可能只是习惯,也可能是因为有时我尝试仅使用日期,但后来发现我需要进行的操作只有 datetime 才能完成。并不完全确定。 - Peter Hansen

16

既然已经展示了Python的例子,那么这里是matlab的例子:

>> datestr(733828, 'yyyymmdd')

ans =

20090224

需要注意的是,虽然它们看起来相似,但在Matlab和Python中它们实际上是不同的东西:

Matlab
序列日期号表示从特定日期和时间算起的整数和小数天数,其中datenum('Jan-1-0000 00:00:00')返回数字1。(年份0000仅作为参考点,并不意味着它是实际时间中的真实年份。)

Python, datetime.date.fromordinal
返回与普通公历序数对应的日期,其中公元1年1月1日的序数为1。

因此它们会相差366天,这显然是0年的长度。


有趣的是,如果这是实际输出的话。使用Python(参见我的答案),它似乎偏了一个。显然这是一种危险的表示日期的方式(至少,在未指定纪元的情况下)。 - Peter Hansen
你在哪个时区?它可能会假设时间戳是GMT,并且下午日期已经在格林威治发生了变化。 - Martin Beckett
1
@Peter:你的意思是一年零一天吗? - SilentGhost
@SilentGhost,是的!我显然没有看到树林中的森林。所以真的很危险... - Peter Hansen
2
@Martin,这是一个好想法,但我认为由于Python日期时间对象在时区方面是“天真”的,因此默认情况下,这些值对于相对于格林威治/协调世界时的位置实际上不受影响。无论如何,SilentGhost的分析都使“差一”理论无效。 - Peter Hansen

6

733828.0是一个时间戳吗?如果是,您可以按照以下步骤操作:

import datetime as dt
dt.date.fromtimestamp(733828.0).strftime('%Y%m%d')

提示

我认为Peter Hansen是正确的 :)

我不是以英语为母语的人。只是想帮忙。我并不太清楚时间戳和序数之间的区别 :(


问题说明这些值对应于“今年的某个日期”,因此它们显然不是时间戳。这个问题的点赞位置有些不合适... - Peter Hansen

6

类似733828.0这样的日期是Rata Die日期,从1年1月1日起计算(包括小数天数)。它们可以根据UTC或您所在时区进行计算。

儒略日期主要用于天文学家,从公元前4713年1月1日格林威治中午开始计算天数(包括小数天数)。儒略日常常与序数日期混淆,后者是当前年份自1月1日起的日期计数(2月2日=第33个序数日)。

因此,datetime将这些称为序数日期,但我认为这只有在Python世界内部才有意义。


+1 是对“Rata Die”的提及的赞同,这是我之前从未听说过的。 - Peter Hansen

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