Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python C API中Numpy datetime64的转换_Python_C_Numpy - Fatal编程技术网

Python C API中Numpy datetime64的转换

Python C API中Numpy datetime64的转换,python,c,numpy,Python,C,Numpy,如何在C中使用从Python传递的datetime64?我在Numpy头文件中找到了一些不推荐使用的函数,如PyArray_DatetimeToDatetimeStruct(),但找不到任何与datetime64相关的函数 它看起来像是一个整数数组以及后端的一些元数据,但如果是这样,如何确定单位 对于那些想知道将来如何做到这一点的人,我最后给出了一个解决方案 从Python将datetime64作为int64传递: dt = np.datetime64(datetime.utcnow()) my

如何在C中使用从Python传递的datetime64?我在Numpy头文件中找到了一些不推荐使用的函数,如PyArray_DatetimeToDatetimeStruct(),但找不到任何与datetime64相关的函数


它看起来像是一个整数数组以及后端的一些元数据,但如果是这样,如何确定单位

对于那些想知道将来如何做到这一点的人,我最后给出了一个解决方案

从Python将datetime64作为int64传递:

dt = np.datetime64(datetime.utcnow())
my_C_func(dt.astype(np.int64))
C中的解码源于gmtime()。此代码假定日期时间以微秒为单位,您可以通过检查数据类型来确定(谢谢@hpaulj)
start
是来自Python的datetime64

inline int
is_leapyear(uint64_t year)
{
    return (year & 0x3) == 0 && /* year % 4 == 0 */
           ((year % 100) != 0 ||
            (year % 400) == 0);
}
#define YEARSIZE(year) (is_leapyear(year) ? 366u : 365u)

...

uint64_t us_per_day = 1000ull * 1000ull * 60ull * 60ull * 24ull;
register uint64_t dayclock = start % us_per_day;
register uint64_t dayno = start / us_per_day;

uint64_t year = 1970ull;

uint64_t us = dayclock % 1000000ull;
uint64_t sec = (dayclock / 1000000ull) % 60ull;
uint64_t minute = (dayclock % 3600000000ull) / 60000000ull;
uint64_t hour = dayclock / 3600000000ull;
while (dayno >= YEARSIZE(year))
{
    dayno -= YEARSIZE(year);
    year++;
}

uint64_t day = dayno + 1;
如果您不需要比秒更精确的东西,您可以简单地执行以下操作:

uint64_t other_start = start / 1000000ull;
struct tm* ptm;
ptm = gmtime((time_t*)&other_start);

printf("\tGMTIME VERSION:\n");
printf("\tyear: %d\n", ptm->tm_year);    
printf("\tday: %d\n", ptm->tm_yday);
printf("\thours: %d\n", ptm->tm_hour);
printf("\tminutes: %d\n", ptm->tm_min);
printf("\tsec: %d\n", ptm->tm_sec);
当然,美国部分可以单独获得:

uint64_t us = source % 1000000ull;

相关:从某种意义上说,它是一个标准数组,每个项有8个字节。处理转换的是数组
dtype
。例如,
x.tolist()
生成Python
datetime
对象的列表。看起来单位信息位于
dtype.str
看起来大部分
numpy
datetime
操作位于
numpy/numpy/core/src/multiarray/datetime.c