问题描述
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
问题:
-
有什么方法可以找到日期列的频率(假设它不是连续的)。我宁愿根据出现频率最高的频率来查找频率。 (即这里是“每日”)。请注意,
.inferred_freq
会给我None
作为频率。
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 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_duplicates
与keep=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