Skip to content

Commit 8651285

Browse files
committed
ENH: Added origin parameter to to_datetime
1 parent 299fb75 commit 8651285

File tree

1 file changed

+58
-18
lines changed

1 file changed

+58
-18
lines changed

pandas/tseries/tools.py

Lines changed: 58 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ def _guess_datetime_format_for_array(arr, **kwargs):
179179
mapping={True: 'coerce', False: 'raise'})
180180
def to_datetime(arg, errors='raise', dayfirst=False, yearfirst=False,
181181
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'):
183183
"""
184184
Convert argument to datetime.
185185
@@ -238,6 +238,17 @@ def to_datetime(arg, errors='raise', dayfirst=False, yearfirst=False,
238238
datetime strings, and if it can be inferred, switch to a faster
239239
method of parsing them. In some cases this can increase the parsing
240240
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
241252
242253
Returns
243254
-------
@@ -294,8 +305,14 @@ def to_datetime(arg, errors='raise', dayfirst=False, yearfirst=False,
294305
>>> %timeit pd.to_datetime(s,infer_datetime_format=False)
295306
1 loop, best of 3: 471 ms per loop
296307
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
298314
315+
"""
299316
from pandas.tseries.index import DatetimeIndex
300317

301318
tz = 'utc' if utc else None
@@ -406,22 +423,45 @@ def _convert_listlike(arg, box, format, name=None, tz=tz):
406423
except (ValueError, TypeError):
407424
raise e
408425

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
425465

426466
# mappings for assembling units
427467
_unit_map = {'year': 'year',

0 commit comments

Comments
 (0)