>我有一个股票价格的数据框:
Dates Price
2019-02-01 52
2019-02-02 51
2019-02-03 53
2019-02-04 55
... ...
2019-08-01 49
2019-08-02 48
2019-08-03 52
现在我想创建新列,该列基本上每 6 个月分配或更新一次组值。所需数据帧:
Dates Price Group
2019-02-01 52 1
2019-02-02 51 1
2019-02-03 53 1
2019-02-04 55 1
... ... ...
2019-08-01 49 2
2019-08-02 48 2
2019-08-03 52 2
group
列的值需要基于数据帧的第一个月值。因此,如果第一行的月份是 04,则组 1 将是 04-09 个月,10-03 应该是第 2 组,依此类推。我希望根据 6 个月的时间窗口间隔更新值。还没有找到解决方案。
附言我想要小组号。增加而不是重复,例如:
Dates Price group
2018-08-01 50 1
... ... ...
2019-01-01 55 1
... ... ...
2019-02-01 60 2
... ... ...
2019-07-01 56 2
2019-08-01 57 3
... ... ...
如果您有连续每天的每日数据,则可以使用to_period
、factorize
和整数除法:
# If necessary
# df['Dates'] = pd.to_datetime(df['Dates'])
df['group'] = (df['Dates'].dt.to_period('M').factorize()[0] // 6) + 1
否则,您可以先使用pandas.period_range
创建组,然后再使用Series.map
创建组。
periods = pd.period_range(df['Dates'].min(), df['Dates'].max(), freq='M')
period_groups = pd.Series((pd.factorize(periods)[0] // 6 + 1), index=periods)
df['group'] = df['Dates'].dt.to_period('M').map(period_groups)
例
df = pd.DataFrame({'Dates': ['2018-08-01', '2019-01-01', '2019-02-01', '2019-07-01', '2019-08-01'], 'Price': [50, 55, 60, 56, 57], 'group': [1, 1, 2, 2, 3]})
df['Dates'] = pd.to_datetime(df['Dates'])
periods = pd.period_range(df['Dates'].min(), df['Dates'].max(), freq='M')
period_groups = pd.Series((pd.factorize(periods)[0] // 6 + 1), index=periods)
df['group_2'] = df['Dates'].dt.to_period('M').map(period_groups)
[出]
Dates Price group group_2
0 2018-08-01 50 1 1
1 2019-01-01 55 1 1
2 2019-02-01 60 2 2
3 2019-07-01 56 2 2
4 2019-08-01 57 3 3