Pandas 中不规则的、不连续的期间

Posted

技术标签:

【中文标题】Pandas 中不规则的、不连续的期间【英文标题】:Irregular, non-contiguous Periods in Pandas 【发布时间】:2013-08-31 10:05:48 【问题描述】:

我需要表示一系列事件。这些事件有点不寻常,因为它们是:

不连续 不重叠 持续时间不规则

例如:

1200 - 1203 1210 - 1225 1304 - 1502

我想使用Pandas.PeriodIndex 来表示这些事件,但我不知道如何创建持续时间不规则的Period 对象。

我有两个问题:

    有没有办法使用现有的 Pandas 功能创建持续时间不规则的 Period 对象? 如果没有,您能否建议如何修改 Pandas 以提供不规则持续时间 Period 对象? (this comment 建议可能“使用带有适当设计的 onOffset、rollforward、rollback 和 apply 方法的自定义 DateOffset 类”)

注意事项

    Period 的文档字符串表明可以指定任意持续时间,例如“5 分钟”的 5T。我相信这个文档字符串是不正确的。运行 pd.Period('2013-01-01', freq='5T') 会产生异常 ValueError: Only mult == 1 supported。我已举报this issue。 "time stamps vs time spans" section in the Pandas documentation 声明“对于常规时间跨度,pandas 使用 Period 对象作为标量值,PeriodIndex 用于跨度序列。更好地支持具有任意起点和终点的不规则间隔即将在未来的版本中推出”(我的重点)

更新 1

构建具有自定义持续时间的Period 看起来非常简单。 但是我认为主要的绊脚石是说服PeriodIndex 接受Periods 和不同的freqs。例如:

In [93]: pd.PeriodIndex([pd.Period('2000', freq='D'), 
                         pd.Period('2001', freq='T')])

ValueError: 2001-01-01 00:00 is wrong freq

PeriodIndex 中的一个中心假设似乎是每个 Period 都具有相同的 freq

【问题讨论】:

我认为最好保持月经周期,即定期。例如,我们可以将您正在寻找的内容称为“时间跨度”。经期对这里有什么帮助?例如,您能否为每个跨度创建一个“开始”列和一个“结束”列?请备份并解释您试图用您的数据完成什么。 嗨,丹。感谢您的快速回复。您的建议与我现在计划实施的非常相似:我计划使用DataFrame。每行将代表一个事件。索引将表示每个事件的开始时间,并且将有一个end 列来表示每个事件的结束时间。备份并解释我的最终目标:我正在编写一个“特征检测器”,它贯穿一个时间序列数据集,并识别该原始数据中的“特征”,这些“特征”可以持续不同的持续时间。 我有一个类似的问题,虽然我的经期很规律,但我无法创建具有我需要的持续时间的经期 - 例如'5000T' 我在 Pandas 文档中找到了这个。这个问题似乎是已知的。 “对于常规时间跨度,pandas 使用 Period 对象作为标量值,使用 PeriodIndex 作为跨度序列。在未来的版本中将更好地支持具有任意起点和终点的不规则间隔。” pandas.pydata.org/pandas-docs/stable/… 【参考方案1】:

根据应用程序,一种可能的解决方案是通过创建一个 PeriodIndex 来对您的数据进行分箱,该 PeriodIndex 的周期等于您处理数据所需的最小时间分辨率单位,然后在分箱中划分数据对于每个事件,将剩余的 bin 保留为空。

【讨论】:

如果“最小时间单位”非常小,这将非常低效。【参考方案2】:

如果您的时间段为分钟,则必须通过日期时间,包括以下分钟:

pd.PeriodIndex([pd.Period('2000-01-01 00:00', freq='T'), 
                     pd.Period('2001-01-01 00:00', freq='T')])

结果:

PeriodIndex(['2000-01-01 00:00', '2001-01-01 00:00'], dtype='period[T]', freq='T')

【讨论】:

以上是关于Pandas 中不规则的、不连续的期间的主要内容,如果未能解决你的问题,请参考以下文章

减去 Pandas 或 Pyspark 数据框中的连续列

如何根据连续天数索引 DataFrame

python pandas - 创建一个保持连续值运行计数的列

pandas dataframe按时间连续性分块

Leetcode 600.不包含连续1的非负整数

切片熊猫数据框以获取不连续的列