Datetime API#

NumPy 内部使用一个 int64 计数器和一个单位元数据结构来表示日期.时间差异也使用 int64 和一个单位元数据结构来表示.下面描述的函数可用于在 ISO 8601 日期字符串、NumPy 日期时间和 C 中的 Python datetime 对象之间进行转换.

数据类型#

除了为 npy_int64 定义的 npy_datetimenpy_timedelta typedefs 外,NumPy 还定义了两个额外的结构体,用于表示时间单位元数据和一个日期的”分解”视图.

type PyArray_DatetimeMetaData#

表示日期时间单位元数据.

typedef struct {
    NPY_DATETIMEUNIT base;
    int num;
} PyArray_DatetimeMetaData;
NPY_DATETIMEUNIT base#

datetime 的单位是

int num#

单位的倍数.

type npy_datetimestruct#

一个”分解”的 datetime 值的视图

typedef struct {
    npy_int64 year;
    npy_int32 month, day, hour, min, sec, us, ps, as;
} npy_datetimestruct;
enum NPY_DATETIMEUNIT#

NumPy 支持的时间单位.枚举变体名称中的”FR”是频率的缩写.

enumerator NPY_FR_ERROR#

错误或未确定的单位.

enumerator NPY_FR_Y#

enumerator NPY_FR_M#

Months

enumerator NPY_FR_W#

enumerator NPY_FR_D#

enumerator NPY_FR_h#

小时

enumerator NPY_FR_m#

会议记录

enumerator NPY_FR_s#

enumerator NPY_FR_ms#

毫秒

enumerator NPY_FR_us#

微秒

enumerator NPY_FR_ns#

纳秒

enumerator NPY_FR_ps#

皮秒

enumerator NPY_FR_fs#

飞秒

enumerator NPY_FR_as#

阿秒

enumerator NPY_FR_GENERIC#

未绑定的单位,可以转换为任何东西

转换函数#

int NpyDatetime_ConvertDatetimeStructToDatetime64(PyArray_DatetimeMetaData *meta, const npy_datetimestruct *dts, npy_datetime *out)#

将日期时间从 datetimestruct 转换为指定单位元数据中的日期时间.假设日期是有效的.

如果元数据结构中的 num 成员很大,此函数中可能会发生整数溢出.

成功时返回 0,失败时返回 -1.

int NpyDatetime_ConvertDatetime64ToDatetimeStruct(PyArray_DatetimeMetaData *meta, npy_datetime dt, npy_datetimestruct *out)#

将带有由单位元数据指定的单位的日期时间转换为扩展的日期时间结构.

成功时返回 0,失败时返回 -1.

int NpyDatetime_ConvertPyDateTimeToDatetimeStruct(PyObject *obj, npy_datetimestruct *out, NPY_DATETIMEUNIT *out_bestunit, int apply_tzinfo)#

测试并转换一个 Python datetime.datetimedatetime.date 对象为 NumPy npy_datetimestruct.

out_bestunit 根据对象是 datetime.date 还是 datetime.datetime 对象,提供一个建议的单位.

如果 apply_tzinfo 是 1,此函数使用 tzinfo 转换为 UTC 时间,否则它返回包含本地时间的结构.

在错误时返回 -1,在成功时返回 0,如果 obj 没有所需的日期或日期时间属性,则返回 1(没有设置错误).

int NpyDatetime_ParseISO8601Datetime(char const *str, Py_ssize_t len, NPY_DATETIMEUNIT unit, NPY_CASTING casting, npy_datetimestruct *out, NPY_DATETIMEUNIT *out_bestunit, npy_bool *out_special)#

解析(几乎)标准的 ISO 8601 日期字符串.不同之处在于:

  • 日期”20100312”被解析为20100312年,而不是等同于”2010-03-12”.日期中的’-‘不是可选的.

  • 只有秒可以有小数点,小数点后最多可以有18位数字(最大阿托秒精度).

  • 可以使用 ‘T’(如 ISO 8601 中)或 ‘ ‘ 来分隔日期和时间.两者都被视为等效.

  • 尚不处理”YYYY-DDD”或”YYYY-Www”格式.

  • 不处理闰秒(在这些情况下,秒值为60).

  • 不处理 24:00:00 作为午夜(00:00:00)明天的同义词

  • 接受特殊值 “NaT”(不是时间),”Today”(根据本地时间的当前日期)和 “Now”(UTC 的当前时间).

str 必须是一个以 NULL 结尾的字符串,并且 len 必须是它的长度.

unit 如果单位未知应包含 -1,或者包含将使用的单位.

casting 控制从字符串中检测到的单位如何被允许转换为 ‘unit’ 参数.

out 被填充为解析的日期时间.

out_bestunit 根据字符串中提供的分辨率量给出建议的单位,或者对于 NaT 给出 -1.

out_special 如果解析的时间是 ‘today’、’now’、空字符串或 ‘NaT’,则设置为 1.对于 ‘today’,推荐的单位是 ‘D’,对于 ‘now’,推荐的单位是 ‘s’,对于 ‘NaT’,推荐的单位是 ‘Y’.

成功时返回0,失败时返回-1.

int NpyDatetime_GetDatetimeISO8601StrLen(int local, NPY_DATETIMEUNIT base)#

返回用于将具有给定本地时间和单位设置的日期时间对象转换为字符串的字符串长度.在构建字符串以提供给 NpyDatetime_MakeISO8601Datetime 时使用此方法.

int NpyDatetime_MakeISO8601Datetime(npy_datetimestruct *dts, char *outstr, npy_intp outlen, int local, int utc, NPY_DATETIMEUNIT base, int tzoffset, NPY_CASTING casting)#

npy_datetimestruct 转换为(几乎)ISO 8601 空终止字符串.如果字符串正好适合空间,它会省略空终止符并返回成功.

与 ISO 8601 的区别在于 ‘NaT’ 字符串,以及年份数字的数量是 >= 4 而不是严格为 4.

如果 local 非零,它会在本地时间生成一个带有 +-#### 时区偏移的字符串.如果 local 为零且 utc 非零,生成一个以 ‘Z’ 结尾的字符串以表示 UTC.默认情况下,不附加时区信息.

base 将输出限制在该单元内.将 base 设置为 -1 以在所有值均为零后自动检测一个基.

如果 local 启用,并且 tzoffset 设置为 -1 以外的值,则使用 tzoffset.这是用于本地时区的手动覆盖,以分钟为单位的偏移量.

casting 控制是否通过将数据截断为更粗略的单位来允许数据丢失.这会与 local 稍微交互,为了将日期单位字符串形成本地时间,转换必须是不安全的.

成功时返回0,失败时返回-1(例如,如果输出字符串太短).