使用panda根据日期范围返回多个列



到目前为止,我基本上是在尝试使用panda来计算收入。我想返回由每个季度末组成的N列。每一列都将计算截至该季度末的总收入。我有:

df['Amortization_per_Day'] = (2.5, 3.2, 5.5, 6.5, 9.2)
df['Start_Date'] = ('1/1/2018', '2/27/2018', '3/31/2018', '5/23/2018', '6/30/2018') 
Date_Range = pd.date_range('10/31/2017', periods=75, freq='Q-Jan')

并想做一些类似的事情:

df['Amortization_per_Day'] * (('Date_Range' - df['Start_Date']).dt.days + 1)

对于date_Range内的每个日期。我不知道如何通过函数传递Date_Range并返回N列。我一直在读关于zip(*df(和shift的文章,但没有完全理解。非常感谢您的帮助。

解决方案

这里有一个完整的解决方案:

from datetime import datetime
import pandas as pd
df = pd.DataFrame()
df['Amortization_per_Day'] = (2.5, 3.2, 5.5, 6.5, 9.2)
df['Start_Date'] = ('1/1/18', '2/27/18', '3/31/18', '5/23/2018', '6/30/2018') 
df['Start_Date'] = pd.to_datetime(df['Start_Date'])
dr = pd.date_range('10/31/2017', periods=75, freq='Q-Jan')
def betweendates(x, y):
xv = x.values.astype('datetime64[D]')
xpad = np.zeros(xv.size + 2, dtype=xv.dtype)
xpad[1:-1] = xv
xpad[0],xpad[-1] = np.datetime64(datetime.min), np.datetime64(datetime.max)
yv = y.values.astype('datetime64[D]')
return (xpad[:-1] <= yv[:,None]) & (xpad[1:] >= yv[:,None])
# get a boolean array that indicates which dates in dr are in between which dates in df['Start_Date']
btwn = betweendates(df['Start_Date'], dr)
# based on the boolean array btwn, select out the salient rows from df and dates from dr
dfsel = df[btwn[:, 1:].T]
drsel = dr[btwn[:, 1:].sum(axis=1, dtype=bool)]
# do the actual calculation the OP wanted
dfsel['Amortization_per_Day'] * ((drsel - dfsel['Start_Date']).dt.days + 1)

输出:

0       77.5
2      170.5
4      294.4
4     1140.8
4     1987.2
4     2806.0
4     3652.4
4     4498.8
4     5345.2
4     6173.2
...   
4    52394.0
4    53212.8
4    54059.2
4    54905.6
4    55752.0
4    56570.8
4    57417.2
4    58263.6
4    59110.0
4    59938.0
Length: 74, dtype: float64

解释

布尔btwn数组如下所示:

[[ True False False False False False]
[False  True False False False False]
[False False False  True False False]
[False False False False False  True]
[False False False False False  True]
[False False False False False  True]
[False False False False False  True]
[False False False False False  True]
[False False False False False  True]
[False False False False False  True]
[False False False False False  True]
[False False False False False  True]
[False False False False False  True]
...

btwn的第i行对应于您的日期范围中的第i个日期时间。在每一行中,正好有一个值为True,其他值为False。第0列中的True值指示日期时间在Start_Times中的任何一个之前,第1列中的True值指示该日期时间在第Start_Times中的第0和第1日期之间,等等。最后一列中的True值表示日期时间在任何Start_Times之后。

通过像这样对btwn进行切片:

btwn[:, 1:]

它可以用于将您的日期范围中的最新时间与紧接在前的CCD_ 18进行匹配。如果您将btwn的切片改为这样:

btwn[:, :-1]

您最终会将每个日期时间与下一个Start_Time进行匹配。

最新更新