python - 使用 pandas 根据日期范围返回多列

标签 python pandas

我基本上是在尝试使用 pandas 计算迄今为止的收入。我想返回由每个季度末组成的 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

说明

bool 值 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]
 ...

ibtwn 行对应于i日期范围内的第一个日期时间。在每一行中,只有一个值是 True ,其他的将是 False 。一个True 0 中的值第 列指示日期时间在任何 Start_Times 之前,一个True 1 中的值st 列指示日期时间在 0 之间th 和 1日期 Start_Times ,等等。一个True最后一列中的值指示日期时间在 Start_Times 中的任何一个之后.

通过切片btwn像这样:

btwn[:, 1:]

它可用于将日期范围内的日期时间与前一个 Start_Time 进行匹配。 。如果您改为更改 btwn 的切片像这样:

btwn[:, :-1]

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

关于python - 使用 pandas 根据日期范围返回多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53698082/

相关文章:

python - 计算两个字段的总和以过滤条目

pandas - 如何获得没有前缀的假人?

python - Pandas 将列中的字符串拆分为多条记录

Python 套接字消息交换

python - 如何将包含整数元组的字符串转换为包含整数元素的元组

python - 如何优雅地处理 SIGTERM 信号?

带有自签名证书的 Python 3 urllib

python - 将多索引与多个列级别和数据框合并

python - 如何使用 pandas 将 n 个 .csv 文件(可能是 20-30 个文件)与 1 个大 .csv 文件水平(轴 = 1)合并?

python - pd.read_csv 的截断问题