繁体   English   中英

如何使用熊猫找到日期差距

[英]How to find gaps in dates using pandas

我有一个数据集,可以显示每月设备的性能。 这是数据的样子

device, date, performance
   1  , 06/16, 50.4
   1  , 07/16, 54
   1  , 08/16, 6
   1  , 09/17, 67
   1  , 10/17, 56
   2  , 01/12, 34
       ....

设备可能在几个月内无法正常工作,因此数据中存在一些空白。 例如,设备一在上述数据中存在一些差距。 我想创建一个数据框,以显示每个设备工作的时间范围,这是结果数据集的外观

device, start, end
 1    ,  06/16, 08/16
 1    ,  09/17, 10/17
     ....

如何使用熊猫创建它?

您可以连续几个月或使用同一设备创建具有相同编号的系列。 为此,您可以使用shift并在DateOffset添加一个月以检查下一行是否相隔一个月。 使用cumsum量为每个新组增加值。 首先,你需要列“日期”作为datetime的系列:

ser_date = pd.to_datetime(df['date'],format='%m/%y')
ser_group = ((((ser_date.shift() + pd.DateOffset(months=1)) != ser_date) | #month apart
              (df.device.diff() != 0)) # different device
              .cumsum()) #increment value for each group

现在,您可以在ser_group上使用groupbyjoin每个组的firstlast ,例如:

g_df = df.groupby(ser_group) #grouped data
df_new = (g_df['device','date'].first() #first of each group
          .join(g_df['date'].last(),rsuffix='_') #joined with last of each group
          .rename(columns={'date':'start','date_':'end'})) #rename column start/end

print (df_new)
   device   start     end
1       1   06/16   08/16
2       1   09/17   10/17
3       2   01/12   01/12

为了提供更多指导,我扩展了一些源数据,以便包含2个设备的5个读数的完整集合。 我还决定将date列更改为真实日期。

该概念基于device分组,然后为每个组生成开始/结束日期。

生成开始/结束时间段的脚本可以如下:

import pandas as pd

# Source data
df = pd.DataFrame(data={ 'device': [ 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 ],
    'date': [ '06/16', '07/16', '08/16', '09/17', '10/17',
        '03/16', '04/16', '11/16', '12/16', '01/17' ],
    'performance': [ 50.4, 54, 6, 67, 56, 50, 45, 30, 72.3, 42 ] })
# Convert date to true dates
df.date = pd.to_datetime(df.date, format='%m/%y')
grp = df.groupby(by='device')
# Starts of periods
st = grp.apply(lambda x: x.date[x.date - pd.DateOffset(months = 1)
    != x.date.shift()]).reset_index(level=1,drop=True)
# Ends of periods
en = grp.apply(lambda x: x.date[x.date + pd.DateOffset(months = 1)
    != x.date.shift(-1)]).reset_index(level=1,drop=True)
# Result - concat start / end dates
res = pd.concat([st, en], axis=1).reset_index()
# Set column names
res.columns = ['device', 'start', 'end']

结果是:

   device      start        end
0       1 2016-06-01 2016-08-01
1       1 2017-09-01 2017-10-01
2       2 2016-03-01 2016-04-01
3       2 2016-11-01 2017-01-01

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM