如何从 C++ 中的 pandas Timestamp 对象中提取 year/hour/day 数据?

How do I extract year/hour/day data from pandas Timestamp object in C++?

我正在开发一个在 C++ 中嵌入了 Python 的项目,运行 遇到了 pandas DataFrames 和 datetimes/Timestamps 的问题。

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

这在 C++ 方面是有问题的,因为我正在使用 PyDateTime API 来提取时间信息,而 pandas Timestamp 对象似乎不兼容。

对于上下文,我使用 boost python 来提取对象,然后我从 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_Check 函数的

None 对 pandas 时间戳对象将 return 为真,如果我尝试绕过该检查,所有提取方法都会获得看似随机的数字。

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

我希望不必修改实际 Python 命名空间中的对象,仅在提取后在 C++ 端修改,但如果没有其他方法,这也不是不可能的。

我已经找到方法了,以防以后有人找这个。

Pandas Timestamp 对象实际上确实提取为 PyDateTime 对象,因此它们不是问题所在。我的问题是我将它们提取为 numpy ndarrays 以首先从 Pandas DataFrame 获取列,而 numpy 将时间戳存储为 datetime64[ns] dtype。这是 Epoch (1970,1,1) 的纳秒数。

为了使这个 numpy 值起作用,我使用 astype 将其转换为 double dtype,然后使用 PyDateTime_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);