可以使用自定義函數date_range
和groupby
與size
:
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
到目前爲止您嘗試了什麼? – 2017-06-06 11:39:45
hello @MrGrj,只能想到31 - df [「date」]。date來獲得休息日,然後用30個休息日來獲取下個月的日子。但是不知道如何將它們放入列中自動 –