在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