是否有任何快速方法可以在python中为时间序列数据执行以下操作?

问题描述

我有一个如下所示的时间序列数据集

id         date          sales
0          2016-01-01    11.0
1          2016-01-02    12.0
2          2016-01-03    3.0
3          2016-01-08    3.1
4          2016-01-09    11.0
5          2016-01-10    34.2
6          2016-01-15    34.2
7          2016-01-16    34.2
8          2016-01-18    11.0

问题:

  1. 有什么方法可以找到日期列的频率(假设它不是连续的)。我宁愿根据出现频率最高的频率来查找频率。 (即这里是“每日”)。请注意,.inferred_freq会给我None作为频率。

  2. 假设我有一个数据集,其中包含第一个数据集中的缺失日期,如下所示:

id         date        
0          2016-01-04   
1          2016-01-05    
2          2016-01-06   
3          2016-01-07   
4          2016-01-11   
5          2016-01-12    
6          2016-01-13    
7          2016-01-14 

在这里,我需要根据以下条件对第一个数据集中的日期进行分组:如果第二个数据框中的下一个缺失日期可用最快的方式。因此,我的第一个数据集应如下所示:

id         date          sales    Group_id
0          2016-01-01    11.0     1 
1          2016-01-02    12.0     1
2          2016-01-03    3.0      1
3          2016-01-08    3.1      2
4          2016-01-09    11.0     2
5          2016-01-10    34.2     2
6          2016-01-15    34.2     3
7          2016-01-16    34.2     3
8          2016-01-18    11.0     3
  1. 是否有任何 FAST 方法(请记住数据框可能包含数百万行),以根据列值(例如,销售额)删除不重复的行。在此,根据列 sales 我要删除的非重复行将是:
1          2016-01-02    12.0
2          2016-01-03    3.0
3          2016-01-08    3.1

因为“销售”列在这三行中具有唯一的值。

解决方法

IIUC,Q1和Q2相同:使用diff检查时间差是否为1天,然后使用cumsum

df["date"] = pd.to_datetime(df["date"])
df["group"] = (df["date"].diff()>pd.Timedelta(days=1)).cumsum()+1
print (df)

   id       date  sales  group
0   0 2016-01-01   11.0      1
1   1 2016-01-02   12.0      1
2   2 2016-01-03    3.0      1
3   3 2016-01-08    3.1      2
4   4 2016-01-09   14.0      2
5   5 2016-01-10   34.2      2
6   6 2016-01-15   34.2      3
7   7 2016-01-16   34.2      3
8   8 2016-01-17   14.0      3
9   9 2016-01-18   11.0      3

drop_duplicateskeep=False一起使用来获得唯一的销售价值:

print (df.drop_duplicates("sales",keep=False))
   id       date  sales  group
1   1 2016-01-02   12.0      1
2   2 2016-01-03    3.0      1
3   3 2016-01-08    3.1      2

duplicated获得的结果没有唯一性:

print (df[df.duplicated("sales",keep=False)])
   id       date  sales  group
0   0 2016-01-01   11.0      1
4   4 2016-01-09   14.0      2
5   5 2016-01-10   34.2      2
6   6 2016-01-15   34.2      3
7   7 2016-01-16   34.2      3
8   8 2016-01-17   14.0      3
9   9 2016-01-18   11.0      3