2015-11-02 75 views
1

我试图给Pandas DataFrame的DateTime索引添加几秒钟。从另一列应用Pandas DataFrame上的时间偏移

为了做到这一点,我需要从另一列减去值:

>>> frame["s_eventdatetime"] = frame["eventdatetime"].apply(lambda x: x - datetime.timedelta(seconds=frame["seconds"])) 
TypeError: unsupported type for timedelta seconds component: Series 

别人是否知道如何为根据行的值,这是每行中不同的做到这一点。没有固定的价值。我认为这失败了,因为有些行有NaN条目。

回答

1

里面一个数据帧,其来自datetimes/Timestamps/DatetimeIndex/datetime64的被内部存储在D型细胞datetime64[ns]的NumPy的数组值的列中。

若要添加或减去表示秒的整数列,请将整数转换为dtype的NumPy数组。然后,您可以执行NumPy的datetime64/timedelta64 arithmetic

import numpy as np 
import pandas as pd 
np.random.seed(2015) 
N = 10 
frame = pd.DataFrame({'eventdatetime':pd.date_range('2000-1-1', periods=N, freq='T'), 
        'seconds': np.random.randint(60, size=N)}) 
frame.loc[::2, 'seconds'] = np.nan 

frame["s_eventdatetime"] = (
    frame["eventdatetime"] - np.array(frame['seconds'].fillna(0), dtype='timedelta64[s]')) 

产生

 eventdatetime seconds  s_eventdatetime 
0 2000-01-01 00:00:00  NaN 2000-01-01 00:00:00 
1 2000-01-01 00:01:00  12 2000-01-01 00:00:48 
2 2000-01-01 00:02:00  NaN 2000-01-01 00:02:00 
3 2000-01-01 00:03:00  9 2000-01-01 00:02:51 
4 2000-01-01 00:04:00  NaN 2000-01-01 00:04:00 
5 2000-01-01 00:05:00  8 2000-01-01 00:04:52 
6 2000-01-01 00:06:00  NaN 2000-01-01 00:06:00 
7 2000-01-01 00:07:00  26 2000-01-01 00:06:34 
8 2000-01-01 00:08:00  NaN 2000-01-01 00:08:00 
9 2000-01-01 00:09:00  59 2000-01-01 00:08:01 

您还可以添加的timedelta64[s]小号与NumPy阵列大熊猫DatetimeIndex的:

x = pd.date_range('2000-1-1', periods=N, freq='T') 
x - np.array(frame['seconds'], dtype='timedelta64[s]') 

产量

In [23]: x 
Out[23]: 
DatetimeIndex(['2000-01-01 00:00:00', '2000-01-01 00:01:00', 
       '2000-01-01 00:02:00', '2000-01-01 00:03:00', 
       '2000-01-01 00:04:00', '2000-01-01 00:05:00', 
       '2000-01-01 00:06:00', '2000-01-01 00:07:00', 
       '2000-01-01 00:08:00', '2000-01-01 00:09:00'], 
       dtype='datetime64[ns]', freq='T', tz=None) 

In [24]: x - np.array(frame['seconds'], dtype='timedelta64[s]') 
Out[24]: 
DatetimeIndex(['1999-12-31 23:59:26', '2000-01-01 00:00:48', 
       '2000-01-01 00:01:26', '2000-01-01 00:02:51', 
       '2000-01-01 00:03:38', '2000-01-01 00:04:52', 
       '2000-01-01 00:05:14', '2000-01-01 00:06:34', 
       '2000-01-01 00:07:47', '2000-01-01 00:08:01'], 
       dtype='datetime64[ns]', freq='T', tz=None) 
+0

这肯定会导致正确的方向。你有一个想法,我怎么可以在该转换中放弃NaN值? np.array(frame ['seconds']。dropna(),dtype ='timedelta64 [s]')似乎不是方式 – wishi

+1

您是否希望将NaN视为0秒?如果是这样,你可以使用frame [“s_eventdatetime”] = frame [“eventdatetime”] - np.array(frame ['seconds']。fillna(0),dtype ='timedelta64 [s]')'。 – unutbu

相关问题