在python中移动选定月份
我正在努力找到以下问题的解决方案:我有一个报告季度值的数据框架。不幸的是,一些公司在典型的发布季度日期后一个月公布季度数据。出于这个原因,我想选择这些日期并将其更改为典型的发布日期。我的数据框如下所示:在python中移动选定月份,python,pandas,dataframe,date,Python,Pandas,Dataframe,Date,我正在努力找到以下问题的解决方案:我有一个报告季度值的数据框架。不幸的是,一些公司在典型的发布季度日期后一个月公布季度数据。出于这个原因,我想选择这些日期并将其更改为典型的发布日期。我的数据框如下所示: # dataframe 1 rng1 = pd.date_range('2014-12-31', periods=5, freq='3M') df1 = pd.DataFrame({ 'Date': rng1, 'Company': [1, 1, 1, 1 ,1], 'Val': np.rand
# dataframe 1
rng1 = pd.date_range('2014-12-31', periods=5, freq='3M')
df1 = pd.DataFrame({ 'Date': rng1, 'Company': [1, 1, 1, 1 ,1], 'Val': np.random.randn(len(rng1)) })
# dataframe 2
rng2 = pd.date_range('2015-01-30', periods=5, freq='3M')
df2 = pd.DataFrame({ 'Date': rng2, 'Company': [2, 2, 2, 2 ,2],'Val': np.random.randn(len(rng2)) })
# Target Dataframe
frames = [df1, df2]
df_fin = pd.concat(frames)
Output:
Date Company Val
0 2014-12-31 1 0.374427
1 2015-03-31 1 0.328239
2 2015-06-30 1 -1.226196
3 2015-09-30 1 -0.153937
4 2015-12-31 1 -0.146096
0 2015-01-31 2 0.283528
1 2015-04-30 2 0.426100
2 2015-07-31 2 -0.044960
3 2015-10-31 2 -1.316574
4 2016-01-31 2 0.353073
所以我想做的是:公司2在一个月后报告他们的数字。出于这个原因,我想更改他们的日期,以便他们与公司1结盟。这意味着我会将2015-01-31等日期更改为2014-12-31
非常感谢您的帮助
提前谢谢我希望我明白你的意思。您可以在此处使用或,通过列值
Company==2向Date
条件添加/减去月数
例如:
df_fin.loc[df_fin['Company']==2,'Date']=df_fin.loc[df_fin['Company']==2,'Date']-pd.DateOffset(月数=1)
df_fin
打印:
# df_fin
Date Company Val
0 2014-12-31 1 -0.794092
1 2015-03-31 1 -2.632114
2 2015-06-30 1 -0.176383
3 2015-09-30 1 0.701986
4 2015-12-31 1 -0.447678
0 2014-12-31 2 -0.003322
1 2015-03-30 2 0.475669
2 2015-06-30 2 -1.024190
3 2015-09-30 2 1.241122
4 2015-12-31 2 0.096882
使用方向最近的
将
中的数据帧df_与参考季度日期qDates
:
# Refrence quarterly dates (typical release dates)
qDates = pd.date_range('2014-12-31', periods=5, freq='Q')
df = pd.merge_asof(
df_fin.sort_values(by='Date'), pd.Series(qDates, name='Quarter'),
left_on='Date', right_on='Quarter', direction='nearest')
df = (
df.sort_values(by=['Company', 'Quarter'])
.drop('Date', 1)
.rename(columns={'Quarter': 'Date'})
.reindex(df_fin.columns, axis=1)
.reset_index(drop=True)
)
非常感谢,这个解决方案对我的示例非常有效。一旦你有了更多的数据帧,并且不知道哪些数据帧被“移位”,那么@shubhamSharma的解决方案也会派上用场。非常感谢,这是一个很好的解决方案。我通过对数据进行下采样和上采样,获得了类似的结果,但这种方法更好、更干净。
# print(df)
Date Company Val
0 2014-12-31 1 0.146874
1 2015-03-31 1 0.297248
2 2015-06-30 1 1.444860
3 2015-09-30 1 -0.348871
4 2015-12-31 1 -0.093267
5 2014-12-31 2 -0.238166
6 2015-03-31 2 -1.503571
7 2015-06-30 2 0.791149
8 2015-09-30 2 -0.419414
9 2015-12-31 2 -0.598963