是否有 python 函数可以按特定时间增量移动收入列?

Is there a python function to shift revenue column by specific timedelta?

请参考附图

我有一个数据框,在列(2020 年到 2025 年)中包含年收入。我想按给定的时间增量(时间偏移列)转移这些列中的收入。我的时间增量是以天为单位的。有没有一种有效的方法来进行转换?

E.G

我想要实现的是将列中的年收入按时移列中的天数移动,即 4 天的收入从一列转移到另一列(即 1.27[116/365 * 4] 应该第一行从 2022 年转移到 2023 年)

提前致谢

文本输入数据

Launch Date Launch Date Base    Time Shift  2020    2021    2022   2023   2024    2025
2022-06-01  2022-06-01          4   0   0   115.98  122.93  119.22  35.31
2025-02-01  2025-02-01          4   0   0   0           0           0           66.18859318
2022-09-01  2022-09-01          4   49.42   254.86  191.12          248.80          206.53          98.22
2025-01-01  2025-01-01          4   0   0   0           0           14.47           54.24
2022-06-01  2022-06-01          4   0   0   50.25       53.26       51.65       15.30
2025-02-01  2025-02-01          4   0   0   0       0       0       28.67
2022-09-01  2022-09-01          4   148.20  758.22  535.45      676.73      545.42      251.83
2025-01-01  2025-01-01          4   0   0   0       0       38.23       139.07
2022-06-01  2022-06-01          4   0   0   140.78      144.88      136.41      39.23

你可以计算出每年要移动多少,然后从当年减去并添加到下一年。

获取感兴趣的列名称

ycols = [str(n) for n in range(2020,2026)]

计算每年(到下一年)需要转移的金额:

shift_df = df[ycols].multiply(df['Time_Shift']/365.0, axis=0)

看起来像这样

        2020     2021      2022      2023      2024      2025
--  --------  -------  --------  --------  --------  --------
 0  0         0        1.27101   1.34718   1.30652   0.386959
 1  0         0        0         0         0         0.725354
 2  0.541589  2.79299  2.09447   2.72658   2.26334   1.07638
 3  0         0        0         0         0.158575  0.594411
 4  0         0        0.550685  0.583671  0.566027  0.167671
 5  0         0        0         0         0         0.314192
 6  1.62411   8.30926  5.86795   7.41622   5.97721   2.75978
 7  0         0        0         0         0.418959  1.52405
 8  0         0        1.54279   1.58773   1.4949    0.429918

现在创建 df 的副本(当然可以使用原始副本)并应用操作:

df2 = df.copy()
df2[ycols] = df2[ycols] - shift_df[ycols]
df2[ycols[1:]] =df2[ycols[1:]] + shift_df[ycols[:-1]].values

这里的最后一行有点棘手——我们使用索引 [1:][:-1] 适当地访问上一年的班次,并且还使用 .values 方法否则列标签不匹配,您可以添加。

之后我们得到 df2:

    Launch_Date    Launch_Date_Base      Time_Shift      2020     2021      2022     2023      2024      2025
--  -------------  ------------------  ------------  --------  -------  --------  -------  --------  --------
 0  2022-06-01     2022-06-01                     4    0         0      114.709   122.854  119.261    36.2296
 1  2025-02-01     2025-02-01                     4    0         0        0         0        0        65.4632
 2  2022-09-01     2022-09-01                     4   48.8784  252.609  191.819   248.168  206.993    99.407
 3  2025-01-01     2025-01-01                     4    0         0        0         0       14.3114   53.8042
 4  2022-06-01     2022-06-01                     4    0         0       49.6993   53.227   51.6676   15.6984
 5  2025-02-01     2025-02-01                     4    0         0        0         0        0        28.3558
 6  2022-09-01     2022-09-01                     4  146.576   751.535  537.891   675.182  546.859   255.047
 7  2025-01-01     2025-01-01                     4    0         0        0         0       37.811   137.965
 8  2022-06-01     2022-06-01                     4    0         0      139.237   144.835  136.503    40.295

如您所见,从 2026 年开始转移的金额是 'lost',即我们不会将其分配给任何新列