python - 如何检测 Pandas 时间序列中的间隙和连续周期

标签 python pandas

我有一个按日期索引的 Pandas 数据框。我想按期间选择所有连续的间隔,并按期间选择所有连续的天数。我该怎么做?

没有列但有日期索引的 Dataframe 示例:

In [29]: import pandas as pd

In [30]: dates = pd.to_datetime(['2016-09-19 10:23:03', '2016-08-03 10:53:39','2016-09-05 11:11:30', '2016-09-05 11:10:46','2016-09-05 10:53:39'])

In [31]: ts = pd.DataFrame(index=dates)

如您所见,2016-08-03 和 2016-09-19 之间存在差距。我如何检测这些以便创建描述性统计数据,即 40 个间隙,间隙持续时间中位数为“x”等。另外,我可以看到 2016-09-05 和 2016-09-06 是两个日期范围。我如何检测这些并打印描述性统计数据?

理想情况下,在每种情况下,结果都将作为另一个 Dataframe 返回,因为我想使用 Dataframe 中的其他列进行分组。

最佳答案

Pandas 版本 1.0.1 有一个内置方法 DataFrame.diff()你可以用它来完成这个。一个好处是您可以使用像 mean() 这样的 pandas 系列函数来快速计算 gaps 系列对象的汇总统计数据

from datetime import datetime, timedelta
import pandas as pd

# Construct dummy dataframe
dates = pd.to_datetime([
    '2016-08-03',
    '2016-08-04',
    '2016-08-05',
    '2016-08-17',
    '2016-09-05',
    '2016-09-06',
    '2016-09-07',
    '2016-09-19'])
df = pd.DataFrame(dates, columns=['date'])

# Take the diff of the first column (drop 1st row since it's undefined)
deltas = df['date'].diff()[1:]

# Filter diffs (here days > 1, but could be seconds, hours, etc)
gaps = deltas[deltas > timedelta(days=1)]

# Print results
print(f'{len(gaps)} gaps with average gap duration: {gaps.mean()}')
for i, g in gaps.iteritems():
    gap_start = df['date'][i - 1]
    print(f'Start: {datetime.strftime(gap_start, "%Y-%m-%d")} | '
          f'Duration: {str(g.to_pytimedelta())}')

关于python - 如何检测 Pandas 时间序列中的间隙和连续周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40118037/

相关文章:

python - 从列表中删除 nan - Python

python - 以多列作为键 Pandas 的 map 数据框

python - Pandas 通过使用根据条件选择的两列中的任意一列来创建列

python - 用数字来拆分字符串

python - Pandas :从数据框中删除以字母开头的行并保存 CSV

python - 过滤时间序列数据中的高频 - python

python - 将第一行与数据框中的列标题合并

python - 是否可以针对特定功能覆盖 Sphinx autodoc?

python - 如何生成具有指定域和范围的所有单射函数?

Python 从列表列表中的特定索引创建列表