如何从C++中的大Pandas时间戳对象中提取年/小时/日数据?

2024-09-30 22:19:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一个嵌入Python的C++项目,并与DeaTime/Times戳一起运行了熊猫数据文件。

将datetime对象添加到pandas时,如果它们在时间戳范围内,则它们似乎会自动转换为时间戳对象。例如:

pandas converts datetime to Timestamp automatically

这在C++方面是有问题的,因为我使用PyDATEFITAPI来提取时间信息,而熊猫时间戳对象似乎不兼容。p>

对于上下文,我使用boostpython提取对象,然后从boost对象中获取PyObject指针,并尝试获取日期数据

以下是我用来提取日期和时间信息的内容:

if(PyDateTime_Check(pyObj)) {
    SQLSMALLINT year = PyDateTime_GET_YEAR(pyObj);
    SQLUSMALLINT month = PyDateTime_GET_MONTH(pyObj);
    SQLUSMALLINT day = PyDateTime_GET_DAY(pyObj);
    SQLUSMALLINT hour = PyDateTime_DATE_GET_HOUR(pyObj);
    SQLUSMALLINT minute = PyDateTime_DATE_GET_MINUTE(pyObj);
    SQLUSMALLINT second = PyDateTime_DATE_GET_SECOND(pyObj);
    SQLUINTEGER usec = PyDateTime_DATE_GET_MICROSECOND(pyObj);
}

PyDateTime/PyDate/PyTime_检查函数都不会在pandas Timestamp对象中返回true,如果我尝试绕过该检查,所有提取方法都会得到看似随机的数字

如何从Timestamp对象中获取相关的日期/时间信息?有没有办法直接获取它们(我错过了一些API),如果没有,有没有办法将pandas Timestamp对象转换成PyDateTime对象?如果需要,我也可以使用boost API或boost::numpy API,因为我的项目中已经有了它们

我希望不要在实际的Python命名空间中修改对象,只在提取后的C++侧修改,但是如果没有其他方法,那是不可能的。p>

Tags: 项目对象方法api信息pandasgetdate
1条回答
网友
1楼 · 发布于 2024-09-30 22:19:20

我已经想出了这个方法,以防以后有人找这个

熊猫时间戳对象实际上是作为PyDateTime对象提取的,所以它们不是问题所在。我的问题是,我将它们提取为numpy ndarray,以便首先从Pandas数据帧获取列,numpy将时间戳存储为datetime64[ns]dtype。这是从新纪元(1970,1,1)算起的纳秒

为了使这个numpy值正常工作,我改为使用astype将其转换为双数据类型,然后使用PyDateTime\u FromTimestamp

PyDateTime_IMPORT;
double d = boost::python::extract<double>(boostObj);
PyObject *timeTuple = Py_BuildValue("(d)", d / 1000000000.0); // convert from nanosec to sec
timeObj = PyDateTime_FromTimestamp(timeTuple);
Py_DECREF(timeTuple);

相关问题 更多 >