From 067066f1df734428eb4b35e729e85618bacacfa1 Mon Sep 17 00:00:00 2001 From: Phillip Cloud Date: Mon, 8 Dec 2014 10:28:18 -0500 Subject: [PATCH] Fix timedelta json on windows --- pandas/src/datetime_helper.h | 18 +++++++++++------- pandas/src/ujson/python/objToJSON.c | 8 ++++---- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/pandas/src/datetime_helper.h b/pandas/src/datetime_helper.h index 8e188a431a086..c8c54dd5fc947 100644 --- a/pandas/src/datetime_helper.h +++ b/pandas/src/datetime_helper.h @@ -1,4 +1,7 @@ #include "datetime.h" +#include "numpy/arrayobject.h" +#include "numpy/arrayscalars.h" +#include #if PY_MAJOR_VERSION >= 3 #define PyInt_AS_LONG PyLong_AsLong @@ -9,15 +12,16 @@ void mangle_nat(PyObject *val) { PyDateTime_GET_DAY(val) = -1; } -long get_long_attr(PyObject *o, const char *attr) { - return PyInt_AS_LONG(PyObject_GetAttrString(o, attr)); +npy_int64 get_long_attr(PyObject *o, const char *attr) { + PyObject *value = PyObject_GetAttrString(o, attr); + return PyLong_Check(value) ? PyLong_AsLongLong(value) : PyInt_AS_LONG(value); } -double total_seconds(PyObject *td) { +npy_float64 total_seconds(PyObject *td) { // Python 2.6 compat - long microseconds = get_long_attr(td, "microseconds"); - long seconds = get_long_attr(td, "seconds"); - long days = get_long_attr(td, "days"); - long days_in_seconds = days * 24 * 3600; + npy_int64 microseconds = get_long_attr(td, "microseconds"); + npy_int64 seconds = get_long_attr(td, "seconds"); + npy_int64 days = get_long_attr(td, "days"); + npy_int64 days_in_seconds = days * 24LL * 3600LL; return (microseconds + (seconds + days_in_seconds) * 1000000.0) / 1000000.0; } diff --git a/pandas/src/ujson/python/objToJSON.c b/pandas/src/ujson/python/objToJSON.c index 00ba8975d58c8..25fbb71482f9e 100644 --- a/pandas/src/ujson/python/objToJSON.c +++ b/pandas/src/ujson/python/objToJSON.c @@ -1452,12 +1452,12 @@ void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc) else if (PyDelta_Check(obj)) { - long value; + npy_int64 value; - if (PyObject_HasAttrString(obj, "value")) + if (PyObject_HasAttrString(obj, "value")) { value = get_long_attr(obj, "value"); - else - value = total_seconds(obj) * 1000000000; // nanoseconds per second + } else + value = total_seconds(obj) * 1000000000LL; // nanoseconds per second exc = PyErr_Occurred();