我有一个按日期索引的 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/