我基本上是在尝试使用熊猫计算迄今为止的收入。我想返回由每个季度末组成的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]
...
第i
th行btwn
对应i
于您日期范围中的第datetime。在每一行中,恰好一个值将为True
,其他行将为False
。甲True
在值0
列指示该日期时间是之前的任何的Start_Times
,一个True
在值1
ST列表示的日期时间是在间0
日和1
在第一日期Start_Times
,等等。一个True
在最后一列值表示的日期时间为之后的任何的Start_Times
。
通过这样的切片btwn
:
btwn[:, 1:]
它可用于将日期范围中的日期时间与前一个日期进行匹配Start_Time
。如果您改为将切片btwn
改为:
btwn[:, :-1]
您最终将每个日期时间与下一个日期时间进行匹配Start_Time
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句