2014-02-25 113 views
0

我需要一個循環做這個代碼做什麼,並自動生成列EP1 EP2等..列蟒蛇大熊貓:如何循環dateframe並添加

df['ep1'] = df.ep1.apply(lambda x: datetime.datetime(x.year,x.month,1)) 
df['ep2'] = df.ep1.apply(lambda x: datetime.datetime((x+datetime.timedelta(days=40)).year,(x+datetime.timedelta(days=40)).month,1)) 
df['ep3'] = df.ep2.apply(lambda x: datetime.datetime((x+datetime.timedelta(days=40)).year,(x+datetime.timedelta(days=40)).month,1)) 

,其中EP矢量是第一個df.opdate和df.closdate之間的幾個月。

爲起始

import pandas as pd 
import datetime 
d = {'closdate' : pd.Series([datetime.datetime(2014, 3, 2), datetime.datetime(2014, 2, 2)]),'opdate' : pd.Series([datetime.datetime(2014, 1, 1), datetime.datetime(2014, 1, 1)])} 

df=pd.DataFrame(d) 

df['ep1'] = df.opdate.apply(lambda x: x if x > datetime.datetime(2014,1,1) else datetime.datetime(2014,1,1)) 
df['ep1'] = df.ep1.apply(lambda x: datetime.datetime(x.year,x.month,1)) 
df['ep2'] = df.ep1.apply(lambda x: datetime.datetime((x+datetime.timedelta(days=40)).year,(x+datetime.timedelta(days=40)).month,1)) 
df['ep3'] = df.ep2.apply(lambda x: datetime.datetime((x+datetime.timedelta(days=40)).year,(x+datetime.timedelta(days=40)).month,1)) 

我怎麼循環,直到EP比df.closdate大?

+0

你爲什麼要重複同樣的動作,以創建'DF [「EP1」]'和你爲什麼要創建'ep1'和'ep2'列那是等同的? –

+0

您的目標是創建日期爲「上一列日期+ 1個月」的列嗎? –

+0

我需要它提前一個月。 ep2應該是ep1之前的一個月(但仍然是第一天的第一天),只要它適合op和該行的接近值 –

回答

3

使用where代替apply,並添加天np.timedelta64

import numpy as np 
from pandas import Timestamp 

months = range(1, 13) 
df['ep0'] = df.opdate.where(df.opdate > Timestamp('20140101'), Timestamp('20140101')) 
for month in months: 
    colname = 'ep%d' % month 
    prev_colname = 'ep%d' % (month - 1) 
    df[colname] = df[prev_colname] + np.timedelta64(40, 'D') 
+0

哇。那很棒。我需要學習這個!有沒有簡單的方法來重新設置新的列到第一天? –

+0

您可以訪問'df.index'的'year','month','day'等屬性並手動重置它,類似於上面的操作。 –