【问题标题】:Slicing by date, using a variable start date按日期切片,使用可变的开始日期
【发布时间】:2022-11-22 18:45:20
【问题描述】:

我试图根据日期列(根据索引计算)进行切片,并且仅根据切片行进行累积求和。

这是要复制/运行的小示例代码:

import numpy
import pandas
data = pandas.DataFrame(
{"Bought" : [1,3,4,6]}, index=pandas.to_datetime(['01-01-2020','02-01-2020','03-01-2020','04-01-2020']))
data['StartDate'] = data.index
data['Cum bought2'] = data.loc[data['StartDate']:]['Bought'].cumsum()

它给我错误“无法使用这些索引器对 DatetimeIndex 进行切片索引”。 如果我将 data.loc[data['StartDate']:] 更改为设定值(即“02-01-2020”),则它可以正常工作。但我希望开始日期可变并取自另一列。

新编辑:由于第一个答案,下面的解决方案到达那里。如果 NaT 在参考栏中,有什么解决办法吗?我不想删除该行。

import numpy
import pandas
data = pandas.DataFrame(
{"Bought" : [1,3,4,6]}, index=pandas.to_datetime(['01-01-2020','02-01-2020','03-01-2020','04-01-2020']))
data['StartDate'] = [pandas.NaT,'02-01-2020','04-01-2020','04-01-2020']

data['Cum Bought'] = data.loc[data['StartDate'].iloc[0]:]['Bought'].cumsum()

【问题讨论】:

    标签: pandas slice


    【解决方案1】:

    您正在尝试使用 Series 作为切片的边界进行索引,这是没有意义的。你需要一个值. data.loc[data['StartDate'].iloc[0]:]data.loc[data['StartDate'].min():] 可以。

    在你的情况下,你应该只使用:

    data['Cum bought2'] = data['Bought'].cumsum()
    

    或者,如果您不确定日期是否已排序:

    data['Cum bought2'] = data['Bought'].sort_index().cumsum()
    

    输出:

                Bought  StartDate  Cum bought2
    2020-01-01       1 2020-01-01            1
    2020-02-01       3 2020-02-01            4
    2020-03-01       4 2020-03-01            8
    2020-04-01       6 2020-04-01           14
    

    【讨论】:

    • 基本上,在每一行,我希望 Cum Bought 列仅根据旁边的“开始日期”开始累积,并在当前行的日期结束。因此,如果尚未达到开始日期,它应该不会显示任何内容。另外,如果 NaT 在日期内,我该如何解决? (我将这个 NaT 场景添加到我的帖子中)。
    • 你是说你想要shift吗? data['Cum bought2'] = data['Bought'].cumsum().shift()
    猜你喜欢
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多