2017-09-25 149 views
0

以下是帶有datetime64 [ns]列的pandas數據框。將pandas.Timedelta添加到datetime64系列或DataFrame中的列

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] 

鑑於這樣的熊貓數據幀,我需要添加/減去這個熊貓列的時間差,但我得到以下異常:

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'] - delta'工作很好,也許老式版本的熊貓,numpy? – jezrael

+1

指定你的熊貓和蟒蛇版本,如果你想這是一個有用的職位。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ - 好主意,完成。謝謝 – jezrael

回答

1

您可以在每個執行timedelta減法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') 

所以,要做到這一點的系列,轉換系列numpy的數組,然後添加三角洲

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

對我來說,它的工作不錯,pandas.Timedelta具有相同的參數datetime.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 
相關問題