如何将不完整和BC维基数据日期转换为时间戳?

时间:2018-03-27 09:21:44

标签: python python-3.x date datetime

Wikidata date format看起来像这样:

+2018-03-26T00:00:00Z 如果道格拉斯亚当斯出生在+1952-03-11T00:00:00Z

然后我可以使用Python来获取这样的时间戳:

from datetime import datetime
from dateutil.parser import parse
datestring = '+1952-03-11T00:00:00Z'
dt_obj = parse(datestring[1:])
print(dt_obj.timestamp())

>>> -562032000.0

正如您在此处所见,我无法使用 + - 值,这表示AD或BC中的日期。

此外,我不能处理不完整的日期:

例如成吉思汗+1162-00-00T00:00:00Z(缺少日期和月份)

BC省的日期也不完整:柏拉图-0427-00-00T00:00:00Z

1 个答案:

答案 0 :(得分:1)

标准datetime模块无法处理负(BC)日期,但NumPy可以。它允许您解析正日期和负日期,虽然由于某种原因它只允许没有符号符号(假定为正)或负符号;也许值得提出一个问题,如the ISO 8601 standard is supposed to support it。但是,缺少的月份和日期不是(afaik)标准的一部分;您可以将'-00'拆分为一种有点笨拙但有效的解决方案。完整的功能可能如下所示:

import numpy as np

def get_timestamp(date_str):
    # Probably not necessary
    date_str = date_str.strip()
    # Remove + sign
    if date_str[0] == '+':
        date_str = date_str[1:]
    # Remove missing month/day
    date_str = date_str.split('-00', maxsplit=1)[0]
    # Parse date
    dt = np.datetime64(date_str)
    # As Unix timestamp (choose preferred datetype)
    return dt.astype('<M8[s]').astype(np.int64)

date1 = '+1952-03-11T00:00:00Z'
date2 = '-0427-00-00T00:00:00Z'
print('Timestamp for {}: {}'.format(date1, get_timestamp(date1)))
# Timestamp for +1952-03-11T00:00:00Z: -562032000
print('Timestamp for {}: {}'.format(date2, get_timestamp(date2)))
# Timestamp for -0427-00-00T00:00:00Z: -75641990400