2017-09-25 11 views
0

여기에 datetime64 [ns] 열이있는 팬더 데이터 프레임이 있습니다.DataFrame의 datetime64 시리즈 또는 열에 pandas.Timedelta 추가

In [69]: dataframe_with_datetime 
    some_other_column     ts 
0     0 2017-09-22 23:29:11 

In [70]: dataframe_with_datetime.info() 
<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 1 entries, 0 to 0 
Data columns (total 2 columns): 
some_other_column 1 non-null int64 
ts     1 non-null datetime64[ns] 
dtypes: datetime64[ns](1), int64(1) 
memory usage: 96.0 bytes 
In [72]: import datetime 
In [73]: offset = datetime.timedelta(hours=5, minutes=30) 
Out[74]: datetime.timedelta(0, 19800) 

In [75]: delta = pd.Timedelta(offset) 
Out[76]: Timedelta('0 days 05:30:00') 

In [77]: dataframe_with_datetime['ts'] 
0 2017-09-22 23:29:11 
Name: ts, dtype: datetime64[ns] 

을 감안할 때 이러한 팬더 dataframe, 나는 추가 /이 팬더 열에서 시간 델타을 뺄 필요하지만, 나는 예외 다음 얻을 : 각에 timedelta 빼기를 수행 할 수 있습니다

In [78]: dataframe_with_datetime['ts'] - delta 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-78-6d6985a3c867> in <module>() 
----> 1 dts['ts'] - td 

/usr/local/lib/python3.5/dist-packages/pandas/core/ops.py in wrapper(left, right, name, na_op) 
    694   left, right = _align_method_SERIES(left, right) 
    695 
--> 696   converted = _Op.get_op(left, right, name, na_op) 
    697 
    698   left, right = converted.left, converted.right 

/usr/local/lib/python3.5/dist-packages/pandas/core/ops.py in get_op(cls, left, right, name, na_op) 
    328    return _Op(left, right, name, na_op) 
    329   else: 
--> 330    return _TimeOp(left, right, name, na_op) 
    331 
    332 

/usr/local/lib/python3.5/dist-packages/pandas/core/ops.py in __init__(self, left, right, name, na_op) 
    341   super(_TimeOp, self).__init__(left, right, name, na_op) 
    342 
--> 343   lvalues = self._convert_to_array(left, name=name) 
    344   rvalues = self._convert_to_array(right, name=name, other=lvalues) 
    345 

/usr/local/lib/python3.5/dist-packages/pandas/core/ops.py in _convert_to_array(self, values, name, other) 
    452    supplied_dtype = values.dtype 
    453   inferred_type = supplied_dtype or lib.infer_dtype(values) 
--> 454   if (inferred_type in ('datetime64', 'datetime', 'date', 'time') or 
    455     is_datetimetz(inferred_type)): 
    456    # if we have a other of timedelta, but use pd.NaT here we 

TypeError: data type "datetime" not understood 
+0

흠, 나를 위해'dataframe_with_datetime [ 'ts'] - 델타'멋지다, 아마도 더 오래된 버전의 팬더, numpy? – jezrael

+1

판다 (pandas)와 파이썬 (python) 버전을 지정하면 유용한 게시물이됩니다. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ - 좋은 생각, 끝났습니다. 감사합니다 – jezrael

답변

1

에 의해 하나의 객체 datetime64 하나.

In [85]: dataframe_with_datetime['ts'][0] 
Out[85]: Timestamp('2017-09-22 23:29:11') 

In [86]: dataframe_with_datetime['ts'][0] + delta 
Out[86]: Timestamp('2017-09-23 04:59:11') 

그래서, 좋은 작업 나를 위해 델타

dataframe_with_datetime['delta_ts'] = dataframe_with_datetime['ts'].values + delta 

    some_other_column     ts   delta_ts 
0     0 2017-09-22 23:29:11 2017-09-23 04:59:11 
1

을, 시리즈에 대해이 작업을 수행 NumPy와 배열에 시리즈를 변환 한 후 추가, pandas.Timedeltadatetime.timedelta 같은 매개 변수를, 그래서 해결책은 간단하다 :

d = {'some_other_column': {0: 0}, 'ts': {0: pd.Timestamp('2017-09-22 23:29:11')}} 
df = pd.DataFrame(d) 
print (df) 
    some_other_column     ts 
0     0 2017-09-22 23:29:11 

delta = pd.Timedelta(hours=5, minutes=30) 
df['ts1'] = df['ts'] - delta 
df['ts2'] = df['ts'] + delta 
print (df) 
    some_other_column     ts     ts1 \ 
0     0 2017-09-22 23:29:11 2017-09-22 17:59:11 

        ts2 
0 2017-09-23 04:59:11 

내 버전 :

print (pd.show_versions()) 

python: 3.5.1.final.0 
python-bits: 64 
OS: Windows 
OS-release: 7 

pandas: 0.20.3 
numpy: 1.12.1