python - 在 Pandas 数据框中为给定日期创建标志矩阵

标签 python pandas

我想在我的数据框中为选择性列的特定日期范围创建零。我坚持寻找任何有效的解决方案。

我的代码创建了一个 1 矩阵。让我们说日期 = 1/10/2016 - 16/8/2018(即年初至今)。 matrix1cols=A,B,C,D:

df = pd.DataFrame(np.ones(shape=(len(dates), len(matrix1cols))), index=dates)
df.columns = ['A','B','C', 'D']

现在,我希望将 A 列的第一季度(一月至三月)日期设为 A = 0,将第二季度的日期设为 B = 0,将第三季度的日期设为 C = 0,将第四季度的日期设为列 D = 0,对于所有年份,在df。 (我实际上是在为自己创建旗帜)

Ps-我的日期已经很多年了,为了方便起见,我简化了数据集。

最佳答案

设置

dates = pd.date_range('2016/10/01', '2018/08/16', freq='M')
matrixcols = list('ABCD')
df = pd.DataFrame(np.ones((len(dates), len(matrixcols)), int), dates, matrixcols)

            A  B  C  D
2016-10-31  1  1  1  1
2016-11-30  1  1  1  1
2016-12-31  1  1  1  1
2017-01-31  1  1  1  1
2017-02-28  1  1  1  1
2017-03-31  1  1  1  1
2017-04-30  1  1  1  1
2017-05-31  1  1  1  1
2017-06-30  1  1  1  1
2017-07-31  1  1  1  1
2017-08-31  1  1  1  1
2017-09-30  1  1  1  1
2017-10-31  1  1  1  1
2017-11-30  1  1  1  1
2017-12-31  1  1  1  1
2018-01-31  1  1  1  1
2018-02-28  1  1  1  1
2018-03-31  1  1  1  1
2018-04-30  1  1  1  1
2018-05-31  1  1  1  1
2018-06-30  1  1  1  1
2018-07-31  1  1  1  1

Numpy 切片

创建一个定义放置零的自定义数组

i = np.array([
    #A  B  C  D
    [1, 1, 0, 1],  # Q1 -> Only column C is zero
    [1, 0, 0, 0],  # Q2 -> cols B, C, D are zero
    [0, 0, 1, 1],  # Q3 -> cols A, B are zero
    [0, 1, 1, 0],  # Q4 -> cols A, D are zero
])

q = df.index.quarter - 1
df * i[q]

            A  B  C  D
2016-10-31  0  1  1  0
2016-11-30  0  1  1  0
2016-12-31  0  1  1  0
2017-01-31  1  1  0  1
2017-02-28  1  1  0  1
2017-03-31  1  1  0  1
2017-04-30  1  0  0  0
2017-05-31  1  0  0  0
2017-06-30  1  0  0  0
2017-07-31  0  0  1  1
2017-08-31  0  0  1  1
2017-09-30  0  0  1  1
2017-10-31  0  1  1  0
2017-11-30  0  1  1  0
2017-12-31  0  1  1  0
2018-01-31  1  1  0  1
2018-02-28  1  1  0  1
2018-03-31  1  1  0  1
2018-04-30  1  0  0  0
2018-05-31  1  0  0  0
2018-06-30  1  0  0  0
2018-07-31  0  0  1  1

从另一个角度来看它是否适用于正确的季度。

i = np.array([
    #A  B  C  D
    [1, 1, 0, 1],  # Q1 -> Only column C is zero
    [1, 0, 0, 0],  # Q2 -> cols B, C, D are zero
    [0, 0, 1, 1],  # Q3 -> cols A, B are zero
    [0, 1, 1, 0],  # Q4 -> cols A, D are zero
])

q = df.index.quarter - 1
df.set_index(df.index.to_period('Q'), append=True).swaplevel(0, 1) * i[q]

                   A  B  C  D
2016Q4 2016-10-31  0  1  1  0
       2016-11-30  0  1  1  0
       2016-12-31  0  1  1  0
2017Q1 2017-01-31  1  1  0  1
       2017-02-28  1  1  0  1
       2017-03-31  1  1  0  1
2017Q2 2017-04-30  1  0  0  0
       2017-05-31  1  0  0  0
       2017-06-30  1  0  0  0
2017Q3 2017-07-31  0  0  1  1
       2017-08-31  0  0  1  1
       2017-09-30  0  0  1  1
2017Q4 2017-10-31  0  1  1  0
       2017-11-30  0  1  1  0
       2017-12-31  0  1  1  0
2018Q1 2018-01-31  1  1  0  1
       2018-02-28  1  1  0  1
       2018-03-31  1  1  0  1
2018Q2 2018-04-30  1  0  0  0
       2018-05-31  1  0  0  0
       2018-06-30  1  0  0  0
2018Q3 2018-07-31  0  0  1  1

关于python - 在 Pandas 数据框中为给定日期创建标志矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51880563/

相关文章:

python - Pandas 数据框尾部不工作

python - 在python中高效读取和验证csv文件

python - 如何基于另一个数据框将数据放入数据框中

python - TCP 客户端无法连接到 TCP 服务器

python - 如何在azure上的同一云服务中部署多台机器

python - 我想在 python 中创建一个 "CGI script",它驻留在内存中并服务多个请求

python - 属性错误: 'numpy.datetime64' object has no attribute 'toordinal'

python - 使用 fancyimpute 和 pandas 进行数据插补

Python绘制次摆线错误?

python - 如何使用 NumPY 对缩小函数进行矢量化?