40
40
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41
41
"""
42
42
43
- from datetime import datetime
43
+ from datetime import datetime , date , timedelta
44
44
import time
45
45
import re
46
46
import copy
47
47
import itertools
48
48
import warnings
49
+ from dateutil .parser import parse
49
50
50
51
import numpy as np
51
52
from pandas import (
@@ -128,8 +129,12 @@ def read_msgpack(path, iterator=False, **kwargs):
128
129
return l [0 ]
129
130
return l
130
131
131
- dtype_dict = { 'datetime64[ns]' : np .dtype ('M8[ns]' ),
132
- 'timedelta64[ns]' : np .dtype ('m8[ns]' ) }
132
+ dtype_dict = { 21 : np .dtype ('M8[ns]' ),
133
+ u'datetime64[ns]' : np .dtype ('M8[ns]' ),
134
+ u'datetime64[us]' : np .dtype ('M8[us]' ),
135
+ 22 : np .dtype ('m8[ns]' ),
136
+ u'timedelta64[ns]' : np .dtype ('m8[ns]' ),
137
+ u'timedelta64[us]' : np .dtype ('m8[us]' ) }
133
138
134
139
def dtype_for (t ):
135
140
if t in dtype_dict :
@@ -169,33 +174,33 @@ def encode(obj):
169
174
return {'typ' : 'period_index' ,
170
175
'klass' : obj .__class__ .__name__ ,
171
176
'name' : getattr (obj ,'name' ,None ),
172
- 'dtype' : obj .dtype .name ,
177
+ 'dtype' : obj .dtype .num ,
173
178
'data' : obj .tolist () }
174
179
elif isinstance (obj , DatetimeIndex ):
175
180
return {'typ' : 'datetime_index' ,
176
181
'klass' : obj .__class__ .__name__ ,
177
182
'name' : getattr (obj ,'name' ,None ),
178
- 'dtype' : obj .dtype .name ,
183
+ 'dtype' : obj .dtype .num ,
179
184
'data' : obj .values .view ('i8' ).tolist (),
180
185
'freq' : obj .freqstr ,
181
186
'tz' : obj .tz }
182
187
elif isinstance (obj , MultiIndex ):
183
188
return {'typ' : 'multi_index' ,
184
189
'klass' : obj .__class__ .__name__ ,
185
190
'names' : getattr (obj ,'names' ,None ),
186
- 'dtype' : obj .dtype .name ,
191
+ 'dtype' : obj .dtype .num ,
187
192
'data' : obj .tolist () }
188
193
else :
189
194
return {'typ' : 'index' ,
190
195
'klass' : obj .__class__ .__name__ ,
191
196
'name' : getattr (obj ,'name' ,None ),
192
- 'dtype' : obj .dtype .name ,
197
+ 'dtype' : obj .dtype .num ,
193
198
'data' : obj .tolist () }
194
199
elif isinstance (obj , Series ):
195
200
if isinstance (obj , SparseSeries ):
196
201
d = {'typ' : 'sparse_series' ,
197
202
'klass' : obj .__class__ .__name__ ,
198
- 'dtype' : obj .dtype .name ,
203
+ 'dtype' : obj .dtype .num ,
199
204
'index' : obj .index ,
200
205
'sp_index' : obj .sp_index ,
201
206
'sp_values' : convert (obj .sp_values )}
@@ -207,7 +212,7 @@ def encode(obj):
207
212
'klass' : obj .__class__ .__name__ ,
208
213
'name' : getattr (obj ,'name' ,None ),
209
214
'index' : obj .index ,
210
- 'dtype' : obj .dtype .name ,
215
+ 'dtype' : obj .dtype .num ,
211
216
'data' : convert (obj .values ) }
212
217
elif issubclass (tobj , NDFrame ):
213
218
if isinstance (obj , SparseDataFrame ):
@@ -239,11 +244,11 @@ def encode(obj):
239
244
'blocks' : [ { 'items' : b .items ,
240
245
'values' : convert (b .values ),
241
246
'shape' : b .values .shape ,
242
- 'dtype' : b .dtype .name ,
247
+ 'dtype' : b .dtype .num ,
243
248
'klass' : b .__class__ .__name__
244
249
} for b in data .blocks ] }
245
250
246
- elif isinstance (obj , datetime ):
251
+ elif isinstance (obj , ( datetime , date , timedelta ) ):
247
252
if isinstance (obj , Timestamp ):
248
253
tz = obj .tzinfo
249
254
if tz is not None :
@@ -255,8 +260,16 @@ def encode(obj):
255
260
'value' : obj .value ,
256
261
'offset' : offset ,
257
262
'tz' : tz }
258
- return { 'typ' : 'datetime' ,
259
- 'data' : obj .isoformat () }
263
+ elif isinstance (obj , timedelta ):
264
+ return { 'typ' : 'timedelta' ,
265
+ 'data' : (obj .days ,obj .seconds ,obj .microseconds ) }
266
+ elif isinstance (obj , datetime ):
267
+ return { 'typ' : 'datetime' ,
268
+ 'data' : obj .isoformat () }
269
+ elif isinstance (obj , date ):
270
+ return { 'typ' : 'date' ,
271
+ 'data' : obj .isoformat () }
272
+ raise Exception ("cannot encode this datetimelike object: %s" % obj )
260
273
elif isinstance (obj , Period ):
261
274
return {'typ' : 'period' ,
262
275
'ordinal' : obj .ordinal ,
@@ -276,8 +289,11 @@ def encode(obj):
276
289
return {'typ' : 'ndarray' ,
277
290
'shape' : obj .shape ,
278
291
'ndim' : obj .ndim ,
279
- 'dtype' : obj .dtype .name ,
292
+ 'dtype' : obj .dtype .num ,
280
293
'data' : convert (obj )}
294
+ elif isinstance (obj , np .timedelta64 ):
295
+ return { 'typ' : 'np_timedelta64' ,
296
+ 'data' : obj .view ('i8' ) }
281
297
elif isinstance (obj , np .number ):
282
298
if np .iscomplexobj (obj ):
283
299
return {'typ' : 'np_scalar' ,
@@ -293,9 +309,8 @@ def encode(obj):
293
309
return {'typ' : 'np_complex' ,
294
310
'real' : obj .real .__repr__ (),
295
311
'imag' : obj .imag .__repr__ ()}
296
- else :
297
- import pdb ; pdb .set_trace ()
298
- return obj
312
+
313
+ return obj
299
314
300
315
def decode (obj ):
301
316
"""
@@ -333,8 +348,11 @@ def create_block(b):
333
348
blocks = [ create_block (b ) for b in obj ['blocks' ] ]
334
349
return globals ()[obj ['klass' ]](BlockManager (blocks , axes ))
335
350
elif typ == 'datetime' :
336
- import pdb ; pdb .set_trace ()
337
- return datetime .fromtimestamp (obj ['data' ])
351
+ return parse (obj ['data' ])
352
+ elif typ == 'date' :
353
+ return parse (obj ['data' ]).date ()
354
+ elif typ == 'timedelta' :
355
+ return timedelta (* obj ['data' ])
338
356
elif typ == 'sparse_series' :
339
357
dtype = dtype_for (obj ['dtype' ])
340
358
return globals ()[obj ['klass' ]](np .array (obj ['sp_values' ],dtype = dtype ),sparse_index = obj ['sp_index' ],
@@ -353,17 +371,22 @@ def create_block(b):
353
371
return np .array (obj ['data' ],
354
372
dtype = np .typeDict [obj ['dtype' ]],
355
373
ndmin = obj ['ndim' ]).reshape (obj ['shape' ])
374
+ elif typ == 'np_timedelta64' :
375
+ return np .timedelta64 (obj ['data' ])
356
376
elif typ == 'np_scalar' :
357
377
if obj .get ('sub_typ' ) == 'np_complex' :
358
378
return c2f (obj ['real' ], obj ['imag' ], obj ['dtype' ])
359
379
else :
360
- return np .typeDict [obj ['dtype' ]](obj ['data' ])
380
+ dtype = dtype_for (obj ['dtype' ])
381
+ try :
382
+ return dtype (obj ['data' ])
383
+ except :
384
+ return dtype .type (obj ['data' ])
361
385
elif typ == 'np_complex' :
362
386
return complex (obj ['real' ]+ '+' + obj ['imag' ]+ 'j' )
363
387
elif isinstance (obj , (dict ,list ,set )):
364
388
return obj
365
389
else :
366
- import pdb ; pdb .set_trace ()
367
390
return obj
368
391
369
392
def pack (o , default = encode ,
0 commit comments