加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 为每个客户查找缺少的datetime值

发布时间:2020-12-16 22:25:01 所属栏目:Python 来源:网络整理
导读:CustID UsageDate EnergyConsumed0 17111 2018-01-01 00:00:00 1.0951 17111 2018-01-01 01:00:00 1.1292 17111 2018-01-01 02:00:00 1.1653 17111 2018-01-01 03:00:00 1.8334 17111 2018-01-01 04:00:00 1.6975 17111 2018-01-01 05:00:00 1.835missing da

    CustID  UsageDate               EnergyConsumed
0   17111   2018-01-01 00:00:00     1.095
1   17111   2018-01-01 01:00:00     1.129
2   17111   2018-01-01 02:00:00     1.165
3   17111   2018-01-01 03:00:00     1.833
4   17111   2018-01-01 04:00:00     1.697
5   17111   2018-01-01 05:00:00     1.835
missing data point 1
6   17111   2018-01-01 07:00:00     1.835
7   17112   2018-01-01 00:00:00     1.095
8   17112   2018-01-01 01:00:00     1.129
missing data point 1
9   17112   2018-01-01 03:00:00     1.833
10  17112   2018-01-01 04:00:00     1.697
11  17112   2018-01-01 05:00:00     1.835

对于每个客户,我都有每小时的数据.但是,两者之间缺少一些数据点.我想检查使用日期的最小值和最大值,并在该时间间隔内填写缺少的使用日期(所有值均为每小时),并且EnergyConsumed为零.我以后可以使用ffill或回填来处理这个问题.

并非每个客户的最大UsageDate都是2018-01-31 23:00:00.所以我们只想将系列扩展到每个客户的最大日期.

缺失点1被替换为

17111        2018-01-01 06:00:00     0

缺失点2被替换为

17112        2018-01-01 02:00:00     0

我的主要问题是如何找到每个客户的最小和最大日期,然后生成日期的差距.

我已经尝试按日期和重新采样进行索引,但没有帮助我找到解决方案.

另外,我想知道是否有办法直接找到上述模式中缺少值的customerID.我的数据非常庞大,@ Vaishali提供的解决方案计算量很大.任何输入都会有所帮助!

最佳答案
您可以按custid对Dataframe进行分组,并使用所需的日期范围创建索引.现在使用此索引重新索引数据

df['UsageDate'] = pd.to_datetime(df['UsageDate'])

idx = df.groupby('CustID')['UsageDate'].apply(lambda x: pd.Series(index = pd.date_range(x.min(),x.max(),freq = 'H'))).index

df.set_index(['CustID','UsageDate']).reindex(idx).fillna(0).reset_index().rename(columns = {'level_1':'UsageDate'})

    CustID  UsageDate               EnergyConsumed
0   17111   2018-01-01 00:00:00     1.095
1   17111   2018-01-01 01:00:00     1.129
2   17111   2018-01-01 02:00:00     1.165
3   17111   2018-01-01 03:00:00     1.833
4   17111   2018-01-01 04:00:00     1.697
5   17111   2018-01-01 05:00:00     1.835
6   17111   2018-01-01 06:00:00     0.000
7   17111   2018-01-01 07:00:00     1.835
8   17112   2018-01-01 00:00:00     1.095
9   17112   2018-01-01 01:00:00     1.129
10  17112   2018-01-01 02:00:00     0.000
11  17112   2018-01-01 03:00:00     1.833
12  17112   2018-01-01 04:00:00     1.697
13  17112   2018-01-01 05:00:00     1.835

说明:由于Usagedates必须是该CustID的最小和最大日期范围内的所有日期,因此我们按CustID对数据进行分组,并使用date_range创建一系列最小和最大日期.将日期设置为系列的索引而不是值. groupby的结果将是一个多索引,CUSTID为0级,使用日期为1级.我们现在使用此multiindex重新索引原始数据帧.它将使用索引匹配的值,在其余部分分配NaN.最后使用fillna将NaN转换为0.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读