我们正在处理如下所示的熊猫数据框。这里的时间列以15分钟为增量,并且缺少一些时间条目。我们要用相应的日期填充缺少的时间条目,并用零填充所有相应的字段。这就是数据框的样子。
df=
date.y timeslot_1 ProductId PlantId region UserId Gender AgeGroup Weights
6/07/2018 1:15:00 1002 8577 6 Mab 2 S 1432.6
6/07/2018 1:15:00 1002 8577 6 Mac 2 M 1629.3
6/07/2018 1:15:00 1001 8647 6 Maa 2 P 5299.6
6/07/2018 1:45:00 1001 7636 C Mab 1 T 1626.4
6/07/2018 1:45:00 1002 8577 6 Maa 1 T 1476.1
6/07/2018 1:45:00 1002 8577 6 Mab 2 S 1432.6
6/07/2018 1:45:00 1002 8577 6 Mac 2 M 1629.3
6/07/2018 1:45:00 1001 8647 6 Maa 2 P 5299.6
6/07/2018 2:00:00 1001 8647 6 Maa 2 P 4731.6
6/07/2018 2:15:00 1001 7636 C Mab 1 T 1638.6
6/07/2018 2:15:00 1002 8808 C Maa 2 M 2465.3
6/07/2018 2:30:00 1002 7491 4 Mab 1 N 5419.8
6/07/2018 2:45:00 1002 7491 4 Mab 1 N 5419.8
6/07/2018 3:15:00 1001 8362 6 Maa 2 X 2227.6
6/07/2018 3:15:00 1002 8714 C Maa 2 P 1820.6
6/07/2018 3:15:00 1001 8668 5 Mab 2 S 2048.4
6/07/2018 4:00:00 1002 8714 C Maa 2 P 1820.6
我们想到了创建另一个基本文件,该文件将包含所有15分钟的增量时间以及相应的日期,然后将基本文件与原始数据帧合并。但是,有些方法似乎不起作用。联接只是将基础文件中的所有位置放在每个日期的末尾。这就是联接的数据框的外观。
date.y timeslot_1 ProductId PlantId region UserId Gender AgeGroup Weights
6/7/2018 1:15:00 1002 8577 6 Mab 2 S 1432.6
6/7/2018 1:15:00 1002 8577 6 Mac 2 M 1629.3
6/7/2018 1:15:00 1001 8647 6 Maa 2 P 5299.6
6/7/2018 1:45:00 1001 7636 C Mab 1 T 1626.4
6/7/2018 1:45:00 1002 8577 6 Maa 1 T 1476.1
6/7/2018 1:45:00 1002 8577 6 Mab 2 S 1432.6
6/7/2018 1:45:00 1002 8577 6 Mac 2 M 1629.3
6/7/2018 1:45:00 1001 8647 6 Maa 2 P 5299.6
6/7/2018 2:00:00 1001 8647 6 Maa 2 P 4731.6
6/7/2018 2:15:00 1001 7636 C Mab 1 T 1638.6
6/7/2018 2:15:00 1002 8808 C Maa 2 M 2465.3
6/7/2018 2:30:00 1002 7491 4 Mab 1 N 5419.8
6/7/2018 2:45:00 1002 7491 4 Mab 1 N 5419.8
6/7/2018 3:15:00 1001 8362 6 Maa 2 X 2227.6
6/7/2018 3:15:00 1002 8714 C Maa 2 P 1820.6
6/7/2018 3:15:00 1001 8668 5 Mab 2 S 2048.4
6/7/2018 4:00:00 1002 8714 C Maa 2 P 1820.6
6/7/2018 1:15:00
6/7/2018 1:30:00
6/7/2018 1:45:00
6/7/2018 2:00:00
6/7/2018 2:15:00
6/7/2018 2:30:00
6/7/2018 2:45:00
6/7/2018 3:00:00
6/7/2018 3:15:00
6/7/2018 3:30:00
6/7/2018 3:45:00
下面是代码
date1='06/03/2018'
date2='06/10/2018'
d=pd.date_range(start=date1+ ' 02:00:00', end=date2+' 02:00:00', freq='15min')
columns=['date']
all_spots=pd.DataFrame(columns=columns)
all_spots=all_spots.assign(date=d)
all_spots=all_spots.astype(str)
all_spots = pd.DataFrame(all_spots.date.str.split(' ',1).tolist(),columns = ['date.y','timeslot_1'])
d=pd.merge(df,all_spots,how='outer', on=['date.y','timeslot_1'])
这就是结果的样子。
date.y timeslot_1 ProductId PlantId region UserId Gender AgeGroup Weights
6/07/2018 1:15:00 1002 8577 6 Mab 2 S 1432.6
6/07/2018 1:15:00 1002 8577 6 Mac 2 M 1629.3
6/07/2018 1:15:00 1001 8647 6 Maa 2 P 5299.6
6/07/2018 1:30:00 0 0 0 0 0 0 0
6/07/2018 1:45:00 1001 7636 C Mab 1 T 1626.4
6/07/2018 1:45:00 1002 8577 6 Maa 1 T 1476.1
6/07/2018 1:45:00 1002 8577 6 Mab 2 S 1432.6
6/07/2018 1:45:00 1002 8577 6 Mac 2 M 1629.3
6/07/2018 1:45:00 1001 8647 6 Maa 2 P 5299.6
6/07/2018 2:00:00 1001 8647 6 Maa 2 P 4731.6
6/07/2018 2:15:00 1001 7636 C Mab 1 T 1638.6
6/07/2018 2:15:00 1002 8808 C Maa 2 M 2465.3
6/07/2018 2:30:00 1002 7491 4 Mab 1 N 5419.8
6/07/2018 2:45:00 1002 7491 4 Mab 1 N 5419.8
6/07/2018 3:00:00 0 0 0 0 0 0 0
6/07/2018 3:15:00 1001 8362 6 Maa 2 X 2227.6
6/07/2018 3:15:00 1002 8714 C Maa 2 P 1820.6
6/07/2018 3:15:00 1001 8668 5 Mab 2 S 2048.4
6/07/2018 3:30:00 0 0 0 0 0 0 0
6/07/2018 3:45:00 0 0 0 0 0 0 0
6/07/2018 4:00:00 1002 8714 C Maa 2 P 1820.6
P.S。要注意的一件事是它只是一小段数据。我们有一个月的数据。因此,我们需要注意日期和时间为24小时格式。
我们希望有人可以帮助解决此问题。
非常感谢!
答案 0 :(得分:0)
我认为您必须创建另一个数据框才能与您的数据框联接。
# Change "1:15", "4:00" to "0:00, 23:59" for your actual data.
hr_range = pd.date_range("1:15", "4:00", freq="15min").strftime('%H:%M:%S')
# Remove 0 to match your format
hr_range = hr_range.str.lstrip('0')
df2 = pd.DataFrame()
df2['timeslot_1'] = hr_range
df2['date.y'] = pd.to_datetime('2018-06-07')
然后将date.y
分别转换为datetime
的{{1}}和set_index
数据帧。
['date.y', 'timeslot_1']
并将df['date.y'] = pd.to_datetime(df['date.y'])
df.set_index(['date.y', 'timeslot_1'], inplace=True)
df2.set_index(['date.y', 'timeslot_1'], inplace=True)
与join
how='outer'
不使用df.join(df2, how='outer').fillna(0).reset_index()
.set_index