首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从字符串日期中提取年日和儒略日

从字符串日期中提取年日和儒略日
EN

Stack Overflow用户
提问于 2012-12-19 07:12:37
回答 8查看 74.2K关注 0票数 29

我在python中有一个字符串"2012.11.07"。我需要将它转换为date对象,然后获得一个整数值,包括一年中的某一天和儒略日。有可能吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-12-19 07:17:12

首先,您可以将其转换为datetime.datetime对象,如下所示:

代码语言:javascript
复制
>>> import datetime
>>> fmt = '%Y.%m.%d'
>>> s = '2012.11.07'
>>> dt = datetime.datetime.strptime(s, fmt)
>>> dt
datetime.datetime(2012, 11, 7, 0, 0)

然后,您可以使用datetime上的方法来获得您想要的…只是datetime没有直接提供您想要的功能,所以您需要转换为time tuple

代码语言:javascript
复制
>>> tt = dt.timetuple()
>>> tt.tm_yday
312

“儒略日”一词有几种不同的含义。如果你正在寻找2012312,你必须间接的去做,例如,下面的其中之一。

代码语言:javascript
复制
>>> int('%d%03d' % (tt.tm_year, tt.tm_yday))
2012312
>>> tt.tm_year * 1000 + tt.tm_yday
2012312

如果你在寻找不同的含义,你应该能够从这里找到它。例如,如果您想要“自公元前4713年1月1日以来的天数”的含义,并且您有一个需要公历年和年中日的公式,则需要插入上面的这两个值。(如果您有一个采用公历年、月和日的公式,则甚至不需要timetuple步骤。)如果你不能确定下一步该怎么做,可以询问更多细节。

如果你没有公式--也许你已经有了--你最好的办法可能是在PyPI和ActiveState中寻找已经存在的模块。例如,快速搜索会找到一个名为jdcal的东西。我以前从未见过它,但我快速浏览了一下pip install jdcal和自述文件,我做到了:

代码语言:javascript
复制
>>> sum(jdcal.gcal2jd(dt.year, dt.month, dt.day))
2456238.5

这和美国海军Julian date converter给我的结果一样。

如果你想要整型的儒略日,而不是小数的儒略日,你必须决定你想要舍入哪个方向-- 0,负无穷,把中午舍入到第二天,把正午舍入到偶数天,等等(注意,儒略日的定义是从公元前4713年1月1日的正午开始,所以2012年11月7日的一半是2456238,另一半是2456239,只有你知道你想要…的是哪一个)。例如,要舍入到0:

代码语言:javascript
复制
>>> int(sum(jdcal.gcal2jd(dt.year, dt.month, dt.day)))
2456238
票数 57
EN

Stack Overflow用户

发布于 2016-08-18 21:08:32

要获得儒略日,请使用datetime.date.toordinal方法并添加固定的偏移量。

儒略日是自公元前4713年1月1日至公元前12点,或公元前4714年11月24日至公元前12点( proleptic Gregorian calendar )以来的天数。请注意,每个儒略日从中午开始,而不是从午夜开始。

toordinal函数返回自公元前1年12月31日00:00以来的天数(换言之,公元1月1日00:00是第1天的开始,而不是第0天)。请注意,公元前1年直接在公元1年之前,没有年份0,因为数字零直到许多世纪后才被发明出来。

代码语言:javascript
复制
import datetime

datetime.date(1,1,1).toordinal()
# 1

只需在toordinal的结果上加上1721424.5,即可得到儒略日。

另一个答案已经解释了如何解析开始时使用的字符串,并将其转换为datetime.date对象。因此,您可以按如下方式查找儒略日:

代码语言:javascript
复制
import datetime

my_date = datetime.date(2012,11,7)   # time = 00:00:00
my_date.toordinal() + 1721424.5
# 2456238.5
票数 7
EN

Stack Overflow用户

发布于 2013-01-04 09:21:09

为了简化abarnert答案的初始步骤:

代码语言:javascript
复制
from dateutil import parser
s = '2012.11.07'
dt = parser.parse(s)

然后应用abanert答案的其余部分。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13943062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档