当前位置: 首页 > 面试题库 >

创建一个Pandas数据框,其中包含跨越日期范围的项目数

邵羽
2023-03-14
问题内容

我有一个DF,它有两个感兴趣的日期,看起来像:

LIST_DATE     END_DATE
2000-04-18    2000-05-17 00:00:00
2000-05-18    2000-09-18 00:00:00
2000-04-18    2001-06-07 00:00:00

我按月创建了一个期间索引表“ montot”,该表目前仅具有月和年索引

<class 'pandas.tseries.period.PeriodIndex'>
freq: M
[1999-01, ..., 2013-07]

我想要做的是对第二个表中的每个月“
montot”计数在该时间段内的第一个表中的项目(可能是按月激活的列表),然后将该字段添加到表中…因此例如,第一个表中的第一项将在第4个月中计数为1,第5个月为一次,而第二项将在第5个月至第9个月中计数为1,依此类推。将每月总计记录在新表/字段中。所以我有一张桌子

Month    active
1/1999     5
2/1999     8

等等。尚不知道如何使用Pandas / Python进行处理…


问题答案:

这是一种实现方法,首先value_counts是每个日期列中的 句点
(使用to_periodTimestamp方法):

In [11]: p = pd.PeriodIndex(freq='m', start='2000-1', periods=18)

In [12]: starts = df['LIST_DATE'].apply(lambda t: t.to_period(freq='m')).value_counts()

In [13]: ends = df['END_DATE'].apply(lambda t: t.to_period(freq='m')).value_counts()

通过PeriodIndex重新为这些索引编制索引,填写NaN(以便您可以减去),并从累积结束数中选择累积开始数,以使您当前处于活动状态:

In [14]: starts.reindex(p).fillna(0).cumsum() - ends.reindex(p).fillna(0).cumsum()
Out[14]: 
2000-01    0
2000-02    0
2000-03    0
2000-04    2
2000-05    2
2000-06    2
2000-07    2
2000-08    2
2000-09    1
2000-10    1
2000-11    1
2000-12    1
2001-01    1
2001-02    1
2001-03    1
2001-04    1
2001-05    1
2001-06    0
Freq: M, dtype: float64

最后一个替代步骤是创建一个DataFrame(最初跟踪更改,因此开始为正,结束为负):

In [21]: current = pd.DataFrame({'starts': starts, 'ends': -ends}, p)

In [22]: current
Out[22]:
         ends  starts
2000-01   NaN     NaN
2000-02   NaN     NaN
2000-03   NaN     NaN
2000-04   NaN       2
2000-05    -1       1
2000-06   NaN     NaN
2000-07   NaN     NaN
2000-08   NaN     NaN
2000-09    -1     NaN
2000-10   NaN     NaN
2000-11   NaN     NaN
2000-12   NaN     NaN
2001-01   NaN     NaN
2001-02   NaN     NaN
2001-03   NaN     NaN
2001-04   NaN     NaN
2001-05   NaN     NaN
2001-06    -1     NaN

In [23]: current.fillna(0)
Out[23]:
         ends  starts
2000-01     0       0
2000-02     0       0
2000-03     0       0
2000-04     0       2
2000-05    -1       1
2000-06     0       0
2000-07     0       0
2000-08     0       0
2000-09    -1       0
2000-10     0       0
2000-11     0       0
2000-12     0       0
2001-01     0       0
2001-02     0       0
2001-03     0       0
2001-04     0       0
2001-05     0       0
2001-06    -1       0

累计跟踪开始和结束时的运行总计:

In [24]: current.fillna(0).cumsum()
Out[24]:
         ends  starts
2000-01     0       0
2000-02     0       0
2000-03     0       0
2000-04     0       2
2000-05    -1       3
2000-06    -1       3
2000-07    -1       3
2000-08    -1       3
2000-09    -2       3
2000-10    -2       3
2000-11    -2       3
2000-12    -2       3
2001-01    -2       3
2001-02    -2       3
2001-03    -2       3
2001-04    -2       3
2001-05    -2       3
2001-06    -3       3

将这些列加在一起,得出当前处于活动状态的列,结果与上面相同:

In [25]: current.fillna(0).cumsum().sum(1)


 类似资料:
  • 问题内容: 我有一个日期和字符串类似于的熊猫数据框: 我需要将其扩展/转换为以下内容,在“ 开始” 和“ 结束” 列之间填写几周(W-SAT),然后向前填充“ 注释” 和“ 项目”中 的数据: 用pandas做到这一点的最佳方法是什么?某种多索引适用吗? 问题答案: 您可以遍历每一行并创建一个新的数据框,然后将它们连接在一起

  • 我试图使用PHP Carbon库填充提供的开始日期和结束日期之间的日期数组。如果日期没有特定的顺序,这将是直截了当的... 以下是场景: 我需要用每周四天填充dates数组。例如,这些日期的顺序必须如此,星期二是开始日期的第二天: 星期二、星期四、星期六、星期天,所以我需要一种方法来获取开始日期,并在迭代到下一周之前添加2天、2天、1天。 使用碳(碳周期/碳间隔)可以做到这一点吗? 或者我的解决方

  • 问题内容: 想创建一个日期列表,从今天开始,然后返回任意天数,例如在我的示例中为100天。有没有比这更好的方法了? 问题答案: 略胜一筹…

  • 问题内容: 动态创建日期范围以便与报表配合使用的最佳方法。 因此,如果给定的一天没有活动,我可以避免报表上的空行。 通常是为了避免此问题:在sql结果中(在mysql或perl端)填充空日期的最直接方法是什么? 问题答案: 在MySQL中,没有直接的方法可以做到这一点。最好的选择是用您选择的服务器端语言生成一个daterange数组,然后从数据库中提取数据,并使用date作为键将结果数组与date

  • 问题内容: 我正在尝试建立一个SQL查询,该查询将为我提供具有相同价格的日期的日期范围。如果价格出现突破,我希望能在新的行中看到它。即使一个月中的某个时间有相同的价格,但如果价格介于两者之间的某个时间有变化,我希望将其视为具有特定日期范围的两个单独的行。 样本数据: 所需结果: 问题答案: 非关系解决方案 我认为没有其他答案是正确的。 不会工作 使用会强制将数据放入物理的“记录归档系统”结构中,然

  • 我有两个共享分组ID的数据帧。我希望根据另一个设置的条件在其中创建一个日期序列。MRE如下: 在这个例子中,我想在 中创建一列日期,从 中的下一个日期开始(每个组 - 组中的 在 中, 在 中)。 具有数据。表中,这些(可怕的)方法都不起作用: 我一直在尝试数据。表方法,因为它们被认为更快(而且实际数据相当大),但实际上,任何(合理的)方法都可以。 我的预期结果是一个看起来像这样的 data.fr

  • 问题内容: 我想为某个列(例如column)选择一个范围。我想选择-0.5到+0.5之间的所有值。如何做到这一点? 我希望使用 但这(自然)给出了ValueError: 我试过了 但这全部输出了。 正确的输出应该是 在pandas数据框列中查找值范围的正确方法是什么? 编辑:问题 使用与 将是之间的区别 和不平等之类的 ? 问题答案: 使用有严格的不平等: 该参数确定是否包括端点(:,:)。这适用

  • 我面临着许多困难。 1)虽然在演讲和历史数据中都有日期信息,但在第一个数据中,我有每个条目的具体日期,在第二个数据中有一个日期范围。理想情况下,我希望能够合并,以便每个演讲条目都与演讲者(姓名)和演讲日期所属的历史条目匹配。 2)期望的输出是有一个data.frame或data.table,其行等于演讲data.frame中的观察值,以及名称、日期和每个角色的列(它们将由值填充)。然而,某些角色在