【问题标题】:Fill timestamp gaps in large dataset填补大型数据集中的时间戳空白
【发布时间】:2020-02-17 14:02:24
【问题描述】:

我有一个包含 100K+ 行的数据集,该数据集上的一列是日期时间列,我们将其命名为 A

我的数据集按 A 列排序。

我想“填补空白”我的数据集,即:如果我有这两行彼此跟随:

0  2019-03-13 08:12:20
1  2019-03-13 08:12:25

我想在它们之间添加缺失的秒数,结果,我会得到这个:

0  2019-03-13 08:12:20
1  2019-03-13 08:12:21
2  2019-03-13 08:12:22
3  2019-03-13 08:12:23
4  2019-03-13 08:12:24
5  2019-03-13 08:12:25

如果两行有不同的日、月或年,我不想在两行之间生成行。

所以如果有这两个连续的行:

0  2019-03-13 08:12:20
1  2019-03-15 08:12:21

我不会添加任何东西。

如果我的两行之间的时间差大于 2 小时,我也无法生成行。

所以如果有这两个连续的行:

0  2019-03-13 08:12:20
1  2019-03-15 11:12:21

我不会添加任何东西。

这里有一个例子来说明我想要什么:

df=pd.DataFrame({'A': ["2019-03-13 08:12:20", "2019-03-13 08:12:25", "2019-03-20 08:17:23", "2019-03-22 08:17:25", "2019-03-22 11:12:20", "2019-03-22 11:12:23", "2019-03-24 12:33:23"]})
                     A
0  2019-03-13 08:12:20
1  2019-03-13 08:12:25
2  2019-03-20 08:17:23
3  2019-03-22 08:17:25
4  2019-03-22 11:12:20
5  2019-03-22 11:12:23
6  2019-03-24 12:33:23

最后,我想要这个结果:

                      A
0   2019-03-13 08:12:20
1   2019-03-13 08:12:21
2   2019-03-13 08:12:22
3   2019-03-13 08:12:23
4   2019-03-13 08:12:24
5   2019-03-13 08:12:25
6   2019-03-20 08:17:23
7   2019-03-22 08:17:25
8   2019-03-22 11:12:20
9   2019-03-22 11:12:21
10  2019-03-22 11:12:22
11  2019-03-22 11:12:23
12  2019-03-24 12:33:23

我试过这个:

将熊猫导入为 pd

df=pd.DataFrame({'A': ["2019-03-13 08:12:20", "2019-03-13 08:12:25", "2019-03-20 08:17:23", "2019-03-22 08:17:25", "2019-03-22 11:12:20", "2019-03-22 11:12:23", "2019-03-24 12:33:23"]})
df['A']=pd.to_datetime(df['A'])
fill = [pd.date_range(df.iloc[i]['A'], df.iloc[i+1]['A'], freq='S') for i in range(len(df)-1) if (df.iloc[i+1]['A']-df.iloc[i]['A']).total_seconds()<=7200]
dates = [item for sublist in fill for item in sublist]
df=df.set_index('A').join(pd.DataFrame(index=pd.Index(dates, name='A')), how='outer').reset_index()
print(df)

它正在做这项工作,但它很慢,有没有更快的方法来做到这一点?

【问题讨论】:

  • 从您的示例看来,它们也必须具有相同的小时和分钟..
  • 也许您可以尝试使用 pandas shift function 比较连续值并仅在差异小于 2 小时时重新采样为 1s。
  • @ec2604 我给出的示例只是为了说明,我无法在此处复制/粘贴 3xxx 行大声笑(如果连续两行具有相同的日期、年份和月份,则为 3xxx,但差异大于 1h 和更少超过 2 小时)
  • @baccandr,对不起,我对 Python 和 Pandas 有点陌生,你能给我举个例子吗?

标签: python pandas data-science


【解决方案1】:

您可以使用diffcumsum 创建具有组号的列,其中两个连续行之间的差小于2 小时。然后set_index A 列可以resample 每组和reset_index 选择您想要的列。

df['gr'] = df.A.diff().gt(pd.Timedelta(hours=2)).cumsum()
df_output = df.set_index('A').groupby('gr', as_index=False).resample('s').sum().reset_index()[['A']]
print (df_output)
                     A
0  2019-03-13 08:12:20
1  2019-03-13 08:12:21
2  2019-03-13 08:12:22
3  2019-03-13 08:12:23
4  2019-03-13 08:12:24
5  2019-03-13 08:12:25
6  2019-03-20 08:17:23
7  2019-03-22 08:17:25
8  2019-03-22 11:12:20
9  2019-03-22 11:12:21
10 2019-03-22 11:12:22
11 2019-03-22 11:12:23
12 2019-03-24 12:33:23

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2019-02-05
    • 2022-12-03
    相关资源
    最近更新 更多