Python中如何将日期后数30天月份的数字
我有一个包含日期数据框,我想处理数据作为遵循功能工程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
-
得到DF后30天[ “日”]
DF [ “日”] + timedelta(月= 1)
数个月的属于特定30天
有什么方法可以快速做到这一点的频率是多少?
谢谢。
可以使用自定义函数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
感谢这是一个不错的方法来使用日期_范围,它是非常快速使用应用..你很聪明我很佩服你大声笑 –
@LeighLove - 我不知道我是否聪明,因为这个解决方案花费2个小时我的时间;)但真正有趣的问题,祝你好运! – jezrael
只是一步一步走。首先你用+ 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 - 有很多!
感谢您的评论。 –
到目前为止您尝试了什么? – 2017-06-06 11:39:45
hello @MrGrj,只能想到31 - df [“date”]。date来获得休息日,然后用30个休息日来获取下个月的日子。但是不知道如何将它们放入列中自动 –