2016-06-14 68 views
3

我有一個熊貓數據幀,看起來像如何獲取Pandas某些特定日期前後的日期時間?

col1 
2015-02-02 
2015-04-05 
2016-07-02 

我想補充,對於每一日期,在第1欄的x天之前和在該日期之後x天。

這意味着,所得到的數據幀將包含更多的行(即,N(1 + 2 * x),其中n是日期在col1的一部開拓創新數目)

我怎樣才能做到這一點在一個適當的Pandonic辦法?

輸出將是(對x=1

col1 
2015-01-01 
2015-01-02 
2015-01-03 
2015-04-04 
etc 

謝謝!

+1

做了你DF只有一個列:'col1'? – MaxU

+0

是的,這基本上是一個DataFrame的日期。如果需要,我們也可以將它作爲一個Series使用。 –

回答

1

你能做到這樣,但我不知道它是做的最好/最快的方式:

In [143]: df 
Out[143]: 
     col1 
0 2015-02-02 
1 2015-04-05 
2 2016-07-02 

In [144]: %paste 
N = 2 
(df.col1.apply(lambda x: pd.Series(pd.date_range(x - pd.Timedelta(days=N), 
               x + pd.Timedelta(days=N)) 
         ) 
     ) 
     .stack() 
     .drop_duplicates() 
     .reset_index(level=[0,1], drop=True) 
     .to_frame(name='col1') 
) 
## -- End pasted text -- 
Out[144]: 
     col1 
0 2015-01-31 
1 2015-02-01 
2 2015-02-02 
3 2015-02-03 
4 2015-02-04 
5 2015-04-03 
6 2015-04-04 
7 2015-04-05 
8 2015-04-06 
9 2015-04-07 
10 2016-06-30 
11 2016-07-01 
12 2016-07-02 
13 2016-07-03 
14 2016-07-04 
1

類似的東西需要一個數據幀與datetime.date列,然後堆疊另一個Series下面timedelta轉移到原始數據。

import datetime 
import pandas as pd 
df = pd.DataFrame([{'date': datetime.date(2016, 1, 2)}, {'date': datetime.date(2016, 1, 1)}], columns=['date']) 
df = pd.concat([df.date, df.date + datetime.timedelta(days=1)], ignore_index=True).to_frame() 
+0

非常感謝,但重點是將所有內容都放在一列中 –

+1

我不確定我是否理解。像這樣垂直堆疊? –

+0

看看我的輸出,你可以看到col1包含更多的行。它包含原始日期,以及這些日期之前和之後的日期。 –

相關問題