@@ -179,7 +179,7 @@ def _guess_datetime_format_for_array(arr, **kwargs):
179
179
mapping = {True : 'coerce' , False : 'raise' })
180
180
def to_datetime (arg , errors = 'raise' , dayfirst = False , yearfirst = False ,
181
181
utc = None , box = True , format = None , exact = True , coerce = None ,
182
- unit = None , infer_datetime_format = False ):
182
+ unit = None , infer_datetime_format = False , origin = 'epoch' ):
183
183
"""
184
184
Convert argument to datetime.
185
185
@@ -238,6 +238,17 @@ def to_datetime(arg, errors='raise', dayfirst=False, yearfirst=False,
238
238
datetime strings, and if it can be inferred, switch to a faster
239
239
method of parsing them. In some cases this can increase the parsing
240
240
speed by ~5-10x.
241
+ origin : scalar convertible to Timestamp / string ('julian', 'epoch'),
242
+ default 'epoch'.
243
+ Define relative offset for the returned dates.
244
+
245
+ - If 'epoch', offset is set to 1-1-1970.
246
+ - If 'julian', unit must be 'D', and offset is set to beginning of
247
+ Julian Calendar.
248
+ - If Timestamp convertible, offset is set to Timestamp identified by
249
+ origin.
250
+
251
+ .. versionadded: 0.20.0
241
252
242
253
Returns
243
254
-------
@@ -294,8 +305,14 @@ def to_datetime(arg, errors='raise', dayfirst=False, yearfirst=False,
294
305
>>> %timeit pd.to_datetime(s,infer_datetime_format=False)
295
306
1 loop, best of 3: 471 ms per loop
296
307
297
- """
308
+ >>> pd.to_datetime(range(100), unit='D', origin=Timestamp('1960-01-01'))
309
+ 0 1960-01-01
310
+ 1 1960-01-02
311
+ ...
312
+ 98 1960-04-08
313
+ 99 1960-04-09
298
314
315
+ """
299
316
from pandas .tseries .index import DatetimeIndex
300
317
301
318
tz = 'utc' if utc else None
@@ -406,22 +423,45 @@ def _convert_listlike(arg, box, format, name=None, tz=tz):
406
423
except (ValueError , TypeError ):
407
424
raise e
408
425
409
- if arg is None :
410
- return arg
411
- elif isinstance (arg , tslib .Timestamp ):
412
- return arg
413
- elif isinstance (arg , ABCSeries ):
414
- from pandas import Series
415
- values = _convert_listlike (arg ._values , False , format )
416
- return Series (values , index = arg .index , name = arg .name )
417
- elif isinstance (arg , (ABCDataFrame , MutableMapping )):
418
- return _assemble_from_unit_mappings (arg , errors = errors )
419
- elif isinstance (arg , ABCIndexClass ):
420
- return _convert_listlike (arg , box , format , name = arg .name )
421
- elif is_list_like (arg ):
422
- return _convert_listlike (arg , box , format )
423
-
424
- return _convert_listlike (np .array ([arg ]), box , format )[0 ]
426
+ def result_without_offset (arg ):
427
+ if arg is None :
428
+ return arg
429
+ elif isinstance (arg , tslib .Timestamp ):
430
+ return arg
431
+ elif isinstance (arg , ABCSeries ):
432
+ from pandas import Series
433
+ values = _convert_listlike (arg ._values , False , format )
434
+ return Series (values , index = arg .index , name = arg .name )
435
+ elif isinstance (arg , (ABCDataFrame , MutableMapping )):
436
+ return _assemble_from_unit_mappings (arg , errors = errors )
437
+ elif isinstance (arg , ABCIndexClass ):
438
+ return _convert_listlike (arg , box , format , name = arg .name )
439
+ elif is_list_like (arg ):
440
+ return _convert_listlike (arg , box , format )
441
+ return _convert_listlike (np .array ([arg ]), box , format )[0 ]
442
+
443
+ if origin == 'julian' :
444
+ if unit != 'D' :
445
+ raise ValueError ("unit must be 'D' for origin='julian'" )
446
+ arg = arg - tslib .Timestamp (0 ).to_julian_date ()
447
+
448
+ result = result_without_offset (arg )
449
+
450
+ offset = None
451
+ if origin != 'epoch' and origin != 'julian' :
452
+ try :
453
+ offset = tslib .Timestamp (origin ) - tslib .Timestamp (0 )
454
+ except ValueError :
455
+ if errors == 'raise' :
456
+ raise ValueError ("Invalid Origin or Origin Out of Bound" );
457
+ elif errors == 'coerce' :
458
+ offset = tslib .NaT
459
+ elif errors == 'ignore' :
460
+ return arg
461
+
462
+ if offset is not None :
463
+ result = result + offset
464
+ return result
425
465
426
466
# mappings for assembling units
427
467
_unit_map = {'year' : 'year' ,
0 commit comments