计算扩展日期窗口内所有日期之间的差异之和



下面的output列是我试图计算的内容,而diffs列是对求和以计算output的差异的解释。

+------------+--------+-------------+
|       date | output |    diffs    |
+------------+--------+-------------+
| 01/01/2000 |        |             |
| 10/01/2000 |      9 | [9]         |
| 20/01/2000 |     29 | [10, 19]    |
| 25/01/2000 |     44 | [5, 15, 24] |
+------------+--------+-------------+

我考虑过使用rolling,然后根据当前窗口中的最后一条记录,在每个窗口中为diff创建一个新列,然后对其求和。然而,rolling似乎没有能力在DataFrame的开头进行修复。我想我可以计算最短日期和最长日期之间的差异,并将其用作滚动期,但这似乎很难。

我也看过expanding,但随着窗口的扩展,我看不到创建新diff的方法。

有没有一个非循环的,希望是可向量化的解决方案?

这是数据帧:

import pandas as pd
import numpy as np

df = pd.DataFrame(
{
'date': (
dt.datetime(2000, 1, 1), dt.datetime(2000, 1, 10),
dt.datetime(2000, 1, 20), dt.datetime(2000, 1, 25),
),
'output': (np.NaN, 9, 29, 44),
}
)

如果您正在寻找输出,请尝试:

datediff = df.date.diff()/pd.Timedelta('1D')
df['output'] = (datediff * np.arange(len(df))).cumsum()

输出:

date  output
0 2000-01-01     NaN
1 2000-01-10     9.0
2 2000-01-20    29.0
3 2000-01-25    44.0

我把它交给你来搞清楚背后的逻辑。

使用numpy广播而不循环:

i = df.date.dt.day.values
j = np.arange(len(df))
df['output'] = np.triu(np.where((j < j[:, None]), i, (i - i[:, None]))).sum(axis = 0)

相关内容

  • 没有找到相关文章

最新更新