【问题标题】:Find and fill the missing time spot in a data frame在数据框中查找并填充缺失的时间点
【发布时间】:2019-04-09 23:50:52
【问题描述】:

我们正在研究如下图所示的 pandas 数据框。这里时间列的增量为 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

附:需要注意的一点是它只是一个数据的 sn-p。我们有一个月的数据。所以我们需要注意日期和时间是 24 小时格式。

我们希望有人能帮忙解决这个问题。

提前非常感谢!!

【问题讨论】:

    标签: python pandas date datetime missing-data


    【解决方案1】:

    我认为您必须创建另一个数据框才能加入您的数据框。

    # 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 转换为datetimeset_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的替代解决方案

    (df.merge(df2, on=['date.y', 'timeslot_1'], how='outer')
       .sort_values(['date.y', 'timeslot_1'])
       .fillna(0))
    

    【讨论】:

    • 非常感谢您的回复。需要注意的一点是date.y 不是一个日期。它也是一个日期范围。我们使用pd.date_range(start=date1+ ' 02:00:00', end=date2+' 02:00:00', freq='15min') 创建了范围。但是,我们必须将其转换为字符串,以便将它们拆分为单独的列中的日期和时间。此外,原始数据框中的日期和时间是日期时间格式。您是否建议在以字符串格式创建hr_range 时将它们转换为字符串
    • @AnalyticsTeam 您可以使用pd.date_rage(start_date, end_date) 而不是单个日期。同样在将datetime 拆分为日期和时间之前,您可以将pd.date_rangeset_index 然后join 一起使用。我必须将其转换为 string 使其可与您的示例数据框连接。
    猜你喜欢
    • 2020-10-28
    • 2018-04-06
    • 2018-12-17
    • 2019-05-10
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多