summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--numpy/core/arrayprint.py11
-rw-r--r--numpy/core/code_generators/generate_numpy_api.py2
-rw-r--r--numpy/core/include/numpy/ndarrayobject.h2
-rw-r--r--numpy/core/numerictypes.py16
-rw-r--r--numpy/core/src/multiarray/arraytypes.c.src33
-rw-r--r--numpy/core/src/multiarray/descriptor.c3
-rw-r--r--numpy/core/src/multiarray/multiarraymodule.c6
-rw-r--r--numpy/core/src/multiarray/scalartypes.c.src6
8 files changed, 57 insertions, 22 deletions
diff --git a/numpy/core/arrayprint.py b/numpy/core/arrayprint.py
index a3edb64d4..6d3c52990 100644
--- a/numpy/core/arrayprint.py
+++ b/numpy/core/arrayprint.py
@@ -188,10 +188,13 @@ def _array2string(a, max_line_width, precision, suppress_small, separator=' ',
# make sure True and False line up.
format_function = _boolFormatter
elif issubclass(dtypeobj, _nt.integer):
- max_str_len = max(len(str(maximum.reduce(data))),
- len(str(minimum.reduce(data))))
- format = '%' + str(max_str_len) + 'd'
- format_function = lambda x: _formatInteger(x, format)
+ if issubclass(dtypeobj, _nt.timeinteger):
+ format_function = str
+ else:
+ max_str_len = max(len(str(maximum.reduce(data))),
+ len(str(minimum.reduce(data))))
+ format = '%' + str(max_str_len) + 'd'
+ format_function = lambda x: _formatInteger(x, format)
elif issubclass(dtypeobj, _nt.floating):
if issubclass(dtypeobj, _nt.longfloat):
format_function = _longfloatFormatter(precision)
diff --git a/numpy/core/code_generators/generate_numpy_api.py b/numpy/core/code_generators/generate_numpy_api.py
index ca702a06a..509048471 100644
--- a/numpy/core/code_generators/generate_numpy_api.py
+++ b/numpy/core/code_generators/generate_numpy_api.py
@@ -2,7 +2,7 @@ import os
import genapi
types = ['Generic','Number','Integer','SignedInteger','UnsignedInteger',
- 'Inexact',
+ 'Inexact', 'TimeInteger',
'Floating', 'ComplexFloating', 'Flexible', 'Character',
'Byte','Short','Int', 'Long', 'LongLong', 'UByte', 'UShort',
'UInt', 'ULong', 'ULongLong', 'Float', 'Double', 'LongDouble',
diff --git a/numpy/core/include/numpy/ndarrayobject.h b/numpy/core/include/numpy/ndarrayobject.h
index a8b4e160a..8d0e444a2 100644
--- a/numpy/core/include/numpy/ndarrayobject.h
+++ b/numpy/core/include/numpy/ndarrayobject.h
@@ -592,7 +592,7 @@ typedef struct {
} npy_timedeltastruct;
-#define PyDataType_GetDatetimeMetaData(descr) (descr->metadata == NULL ? NULL : ((PyArray_DatetimeMetaData *)(PyCObject_AsVoidPtr(PyDict_GetItemString((descr->metadata, NPY_METADATA_DTSTR))))))
+#define PyDataType_GetDatetimeMetaData(descr) ((descr->metadata == NULL) ? NULL : ((PyArray_DatetimeMetaData *)(PyCObject_AsVoidPtr(PyDict_GetItemString(descr->metadata, NPY_METADATA_DTSTR)))))
typedef int (PyArray_FinalizeFunc)(PyArrayObject *, PyObject *);
diff --git a/numpy/core/numerictypes.py b/numpy/core/numerictypes.py
index 24c88aaf6..c72cc122a 100644
--- a/numpy/core/numerictypes.py
+++ b/numpy/core/numerictypes.py
@@ -32,10 +32,13 @@ Exported symbols include:
int_, uint,
longlong, ulonglong,
+
single, csingle,
float_, complex_,
longfloat, clongfloat,
+ datetime, timedelta, (these inherit from timeinteger which inherits from signedinteger)
+
As part of the type-hierarchy: xx -- is bit-width
@@ -87,7 +90,6 @@ import types as _types
# as numerictypes.bool, etc.
from __builtin__ import bool, int, long, float, complex, object, unicode, str
-
# String-handling utilities to avoid locale-dependence.
# "import string" is costly to import!
@@ -626,27 +628,25 @@ typecodes = {'Character':'c',
'Complex':'FDG',
'AllInteger':'bBhHiIlLqQpP',
'AllFloat':'fdgFDG',
- 'Datetime': 'Tt',
- 'All':'?bhilqpBHILQPfdgFDGSUVOTt'}
+ 'Datetime': 'Mm',
+ 'All':'?bhilqpBHILQPfdgFDGSUVOMm'}
# backwards compatibility --- deprecated name
typeDict = sctypeDict
typeNA = sctypeNA
-# FIXME: Decide how T and t need to be integrated here.
-
# b -> boolean
# u -> unsigned integer
# i -> signed integer
# f -> floating point
# c -> complex
-# T -> datetime
-# t -> timedelta
+# M -> datetime
+# m -> timedelta
# S -> string
# U -> Unicode string
# V -> record
# O -> Python object
-_kind_list = ['b', 'u', 'i', 'f', 'c', 'S', 'U', 'V', 'O']
+_kind_list = ['b', 'u', 'i', 'f', 'c', 'S', 'U', 'V', 'O', 'M', 'm']
__test_types = typecodes['AllInteger'][:-2]+typecodes['AllFloat']+'O'
__len_test_types = len(__test_types)
diff --git a/numpy/core/src/multiarray/arraytypes.c.src b/numpy/core/src/multiarray/arraytypes.c.src
index 49f9cceaf..7080fbe7a 100644
--- a/numpy/core/src/multiarray/arraytypes.c.src
+++ b/numpy/core/src/multiarray/arraytypes.c.src
@@ -198,6 +198,7 @@ NPY_NO_EXPORT PyObject *
PyDateTime_FromInt64(datetime val, PyArray_Descr *descr)
{
PyArray_DatetimeMetaData *meta;
+
meta = PyDataType_GetDatetimeMetaData(descr);
if (meta == NULL) {
PyErr_SetString(PyExc_RuntimeError, "metadata not set for descriptor");
@@ -346,7 +347,7 @@ PyDateTime_AsInt64(PyObject *obj, PyArray_Descr *descr)
meta = PyDataType_GetDatetimeMetaData(descr);
if (meta == NULL) {
PyErr_SetString(PyExc_RuntimeError, "metadata not set for descriptor");
- return NULL;
+ return -1;
}
@@ -378,7 +379,7 @@ PyTimeDelta_AsInt64(PyObject *obj, PyArray_Descr *descr)
meta = PyDataType_GetDatetimeMetaData(descr);
if (meta == NULL) {
PyErr_SetString(PyExc_RuntimeError, "metadata not set for descriptor");
- return NULL;
+ return -1;
}
if (meta->events > 1) {
@@ -2965,6 +2966,25 @@ NPY_NO_EXPORT PyArray_Descr @from@_Descr = {
/**end repeat**/
+static void
+_init_datetime_descr(PyArray_Descr *descr)
+{
+ PyArray_DatetimeMetaData *dt_data;
+ PyObject *cobj;
+
+ dt_data = _pya_malloc(sizeof(PyArray_DatetimeMetaData));
+ dt_data->base = NPY_FR_us;
+ dt_data->num = 1;
+ dt_data->den = 1;
+ dt_data->events = 1;
+
+ cobj = PyCObject_FromVoidPtr((void *)dt_data, _pya_free);
+ descr->metadata = PyDict_New();
+ PyDict_SetItemString(descr->metadata, NPY_METADATA_DTSTR, cobj);
+ Py_DECREF(cobj);
+
+}
+
#define _MAX_LETTER 128
static char _letter_to_num[_MAX_LETTER];
@@ -3045,6 +3065,14 @@ PyArray_DescrFromType(int type)
else {
Py_INCREF(ret);
}
+
+ /* Make sure dtype metadata is initialized for DATETIME */
+ if (PyTypeNum_ISDATETIME(type)) {
+ if (ret->metadata == NULL) {
+ _init_datetime_descr(ret);
+ }
+ }
+
return ret;
}
@@ -3176,6 +3204,7 @@ set_typeinfo(PyObject *dict)
SETTYPE(Integer);
SETTYPE(Inexact);
SETTYPE(SignedInteger);
+ SETTYPE(TimeInteger);
SETTYPE(UnsignedInteger);
SETTYPE(Floating);
SETTYPE(ComplexFloating);
diff --git a/numpy/core/src/multiarray/descriptor.c b/numpy/core/src/multiarray/descriptor.c
index 001617364..c112c8711 100644
--- a/numpy/core/src/multiarray/descriptor.c
+++ b/numpy/core/src/multiarray/descriptor.c
@@ -1327,8 +1327,9 @@ PyArray_DescrNew(PyArray_Descr *base)
Py_INCREF(new->subarray->shape);
Py_INCREF(new->subarray->base);
}
- Py_XINCREF(new->typeobj);
+ Py_XINCREF(new->typeobj);
Py_XINCREF(new->metadata);
+
return new;
}
diff --git a/numpy/core/src/multiarray/multiarraymodule.c b/numpy/core/src/multiarray/multiarraymodule.c
index 5f8055438..6f9c34313 100644
--- a/numpy/core/src/multiarray/multiarraymodule.c
+++ b/numpy/core/src/multiarray/multiarraymodule.c
@@ -2585,8 +2585,10 @@ setup_scalartypes(PyObject *NPY_UNUSED(dict))
#else
SINGLE_INHERIT(LongLong, SignedInteger);
#endif
- SINGLE_INHERIT(Datetime, SignedInteger);
- SINGLE_INHERIT(Timedelta, SignedInteger);
+
+ SINGLE_INHERIT(TimeInteger, SignedInteger);
+ SINGLE_INHERIT(Datetime, TimeInteger);
+ SINGLE_INHERIT(Timedelta, TimeInteger);
/*
fprintf(stderr,
diff --git a/numpy/core/src/multiarray/scalartypes.c.src b/numpy/core/src/multiarray/scalartypes.c.src
index 861cf0c99..28ba7f47a 100644
--- a/numpy/core/src/multiarray/scalartypes.c.src
+++ b/numpy/core/src/multiarray/scalartypes.c.src
@@ -32,9 +32,9 @@ NPY_NO_EXPORT PyBoolScalarObject _PyArrayScalar_BoolValues[] = {
/**begin repeat
* #name = number, integer, signedinteger, unsignedinteger, inexact,
- * floating, complexfloating, flexible, character#
+ * floating, complexfloating, flexible, character, timeinteger#
* #NAME = Number, Integer, SignedInteger, UnsignedInteger, Inexact,
- * Floating, ComplexFloating, Flexible, Character#
+ * Floating, ComplexFloating, Flexible, Character, TimeInteger#
*/
NPY_NO_EXPORT PyTypeObject Py@NAME@ArrType_Type = {
PyObject_HEAD_INIT(NULL)
@@ -3015,7 +3015,7 @@ initialize_numeric_types(void)
/**begin repeat
* #NAME= Number, Integer, SignedInteger, UnsignedInteger, Inexact,
- * Floating, ComplexFloating, Flexible, Character#
+ * Floating, ComplexFloating, Flexible, Character, TimeInteger#
*/
Py@NAME@ArrType_Type.tp_flags = BASEFLAGS;
/**end repeat**/