2017-06-06 81 views
1

我有一個包含日期數據框,我想處理數據作爲遵循功能工程Python中如何將日期後數30天月份的數字

DF

date 
2016/1/1 
2015/2/10 
2016/4/5 

過程後,我想提出的DF看起來像

date  Jan Feb Mar Apr  
2016/1/1 30  0 0  0 //date from 1/1 to 1/30 : the number of dates in jan 
2015/2/10 0  19 11  0 //date from 2/10 to 3/11 : the number of dates in feb and no of dates in mar 
2016/3/25 0  0 7  21 //date from 3/25 to 4/21 : the number of dates in mar and no of dates in apr 
  1. 得到DF後30天[ 「日」]

    DF [ 「日」] + timedelta(月= 1)

  2. 數個月的屬於特定30天

有什麼方法可以快速做到這一點的頻率是多少?

謝謝。

+0

到目前爲止您嘗試了什麼? – 2017-06-06 11:39:45

+0

hello @MrGrj,只能想到31 - df [「date」]。date來獲得休息日,然後用30個休息日來獲取下個月的日子。但是不知道如何將它們放入列中自動 –

回答

1

可以使用自定義函數date_rangegroupbysize

date = df[['date']] 
names = ['Jan', 'Feb','Mar','Apr','May'] 

def f(x): 
    print (x['date']) 
    a = pd.date_range(x['date'], periods=30) 
    a = pd.Series(a).groupby(a.month).size() 
    return (a) 


df = df.apply(f, axis=1).fillna(0).astype(int) 
df = df.rename(columns = {k:v for k,v in enumerate(names)}) 
df = date.join(df) 
print (df) 
     date Feb Mar Apr May 
0 2016-01-01 30 0 0 0 
1 2015-02-10 0 19 11 0 
2 2016-03-25 0 0 7 23 

類似的解決方案與value_counts

date = df[['date']] 
names = ['Jan', 'Feb','Mar','Apr','May'] 

df = df.apply(lambda x: pd.date_range(x['date'], periods=30).month.value_counts(), axis=1) 
     .fillna(0) 
     .astype(int) 
df = df.rename(columns = {k:v for k,v in enumerate(names)}) 
df = date.join(df) 
print (df) 

另一種解決方案:

names = ['Jan', 'Feb','Mar','Apr','May'] 
date = df[['date']] 

df["date1"] = df["date"] + pd.Timedelta(days=29) 
df = df.reset_index().melt(id_vars='index', value_name='date').set_index('date') 
df = df.groupby('index').resample('D').asfreq() 
df = df.groupby([df.index.get_level_values(0), df.index.get_level_values(1).month]) 
     .size() 
     .unstack(fill_value=0) 
df = df.rename(columns = {k+1:v for k,v in enumerate(names)}) 
df = date.join(df) 
print (df) 
     date Jan Feb Mar Apr 
0 2016-01-01 30 0 0 0 
1 2015-02-10 0 19 11 0 
2 2016-03-25 0 0 7 23 
+0

感謝這是一個不錯的方法來使用日期_範圍,它是非常快速使用應用..你很聰明我很佩服你大聲笑 –

+1

@LeighLove - 我不知道我是否聰明,因爲這個解決方案花費2個小時我的時間;)但真正有趣的問題,祝你好運! – jezrael

2

只是一步一步走。首先你用+ pd.to_timedelta('30d')抵消你的原始日期。然後創建一個僅表示月份爲df.date.dt.month的列。然後爲每個日期創建一個包含月末日期的列 - 這裏有一些想法:Want the last day of each month for a data frame in pandas。最後,填寫列爲12個月的矩陣,在月份和月份+ 1的列中設置值。

通過一次一頁地豐富您的DataFrame一列,您可以輕鬆地從您的輸入移動到所需的輸出。在一次通話中不可能有一種萬能的方法。

在這裏閱讀關於熊貓的所有日期/時間函數:https://pandas.pydata.org/pandas-docs/stable/timeseries.html - 有很多!

+0

感謝您的評論。 –

相關問題