日期时间 API#
NumPy 在内部使用一个 int64 计数器和一个单元元数据结构来表示日期。时间差也类似地使用一个 int64 和一个单元元数据结构来表示。下面描述的函数可用于促进在 C 语言中 ISO 8601 日期字符串、NumPy 日期时间对象和 Python 日期时间对象之间的转换。
数据类型#
除了 npy_datetime
和 npy_timedelta
对 npy_int64
的类型定义之外,NumPy 还定义了两个额外的结构体,用于表示时间单元元数据和日期时间的“展开”视图。
-
type PyArray_DatetimeMetaData#
表示日期时间单元元数据。
typedef struct { NPY_DATETIMEUNIT base; int num; } PyArray_DatetimeMetaData;
-
NPY_DATETIMEUNIT base#
日期时间的单位。
-
int num#
单位的乘数。
-
NPY_DATETIMEUNIT base#
-
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”是 frequency(频率)的缩写。
-
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#
无绑定单位,可转换为任何类型
-
enumerator NPY_FR_ERROR#
转换函数#
-
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.datetime
或datetime.date
对象转换为 NumPy 的npy_datetimestruct
。out_bestunit
根据对象是datetime.date
还是datetime.datetime
对象,给出建议的单位。如果
apply_tzinfo
为 1,此函数将使用时区信息(tzinfo)转换为 UTC 时间,否则返回包含本地时间的结构体。错误时返回 -1,成功时返回 0,如果对象不包含所需的日期或日期时间属性则返回 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。如果解析的时间是‘today’、‘now’、空字符串或‘NaT’,则
out_special
将设置为 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 的 NULL 结尾字符串。如果字符串刚好适合空间,则省略 NULL 终止符并返回成功。与 ISO 8601 的区别在于‘NaT’字符串,以及年份位数大于等于 4 而不是严格等于 4。
如果
local
非零,则生成一个带有 +-#### 时区偏移的本地时间字符串。如果local
为零且utc
非零,则生成一个以‘Z’结尾的字符串表示 UTC。默认情况下,不附加任何时区信息。base
将输出限制为该单位。将base
设置为 -1 以自动检测所有值都为零的基数。如果
local
启用且tzoffset
设置为非 -1 的值,则使用tzoffset
。这是手动覆盖要使用的本地时区,以分钟为单位进行偏移。casting
控制是否允许通过将数据截断为更粗的单位而造成数据丢失。这与local
稍有交互,为了将日期单位字符串形成本地时间,转换必须是不安全的。成功返回 0,失败返回 -1(例如输出字符串太短)。