2015-11-02 70 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

相關問題