日期时间 API#

NumPy 在内部使用 int64 计数器和单元元数据结构来表示日期。时间差也类似地使用 int64 和单元元数据结构来表示。下面描述的函数可用于促进在 ISO 8601 日期字符串、NumPy 日期时间和 Python 日期时间对象之间进行 C 语言转换。

数据类型#

除了 npy_datetimenpy_timedelta 用于 npy_int64 的类型定义之外,NumPy 还定义了另外两个结构体,它们分别表示时间单元元数据和日期时间的“展开”视图。

type PyArray_DatetimeMetaData#

表示日期时间单元元数据。

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

日期时间的单位。

int num#

单位的乘数。

type npy_datetimestruct#

日期时间值的“展开”视图

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#

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 位(最大精度为阿秒)。

  • 可以使用 ISO 8601 中的‘T’或‘ ’来分隔日期和时间。两者被等效对待。

  • (目前)不处理“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)#

返回用于将具有给定本地时间和单位设置的 datetime 对象转换为字符串的字符串长度。在构造要提供给 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 NULL 结尾的字符串。如果字符串完全适合空间,则它会省略 NULL 终止符并返回成功。

与 ISO 8601 的不同之处在于 ‘NaT’ 字符串,以及年份数字的位数 >= 4,而不是严格的 4 位。

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

base 将输出限制为该单位。将 base 设置为 -1 以自动检测所有值为零之后的基数。

tzoffset 在启用 localtzoffset 设置为 -1 以外的值时使用。这是对要使用的本地时区的 manual 覆盖,以分钟为单位的偏移量。

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

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