首页 > 解决方案 > 当字符串更改时,如何在不同的数据框中写入初始日期和最终日期?

问题描述

我是 Python 新手,我在以 Python 方式编写以下内容时遇到了一些麻烦,并且没有使用太多可能会降低性能的循环。

我有一个看起来像这样的数据框:

Datetime    Status    Value  
2014-09-28 18:00:00    On    3  
2014-09-28 19:00:00    On    3  
2014-09-28 20:00:00    On    3  
2014-09-28 21:00:00    Off    4  
2014-09-28 22:00:00    Off    6  
2014-09-28 23:00:00    Unknown  nan  
2014-09-29 00:00:00    Unknown  nan  
2014-09-29 01:00:00    Unknown  nan  
2014-09-29 02:00:00    Unknown  nan  
2014-09-29 03:00:00    On    1  
2014-09-29 04:00:00    On    3  
2014-09-29 05:00:00    On    5  
2014-09-29 06:00:00    Off    3  
2014-09-29 07:00:00    Off    2  

我需要创建另一个数据框,其中包含机器处于特定状态的初始、最终日期和持续时间。另外,我想确定每个状态的平均值(具有相同状态的连续行)。例如:

Initial_date         Final_date           Duration  Value Status     
2014-09-28 18:00:00  2014-09-28 20:00:00  3         3    On      
2014-09-28 21:00:00  2014-09-28 22:00:00  2         5    Off    
2014-09-28 23:00:00  2014-09-29 02:00:00  4         nan    Unknown  
2014-09-29 03:00:00  2014-09-29 05:00:00  3         3     On  
2014-09-29 06:00:00  2014-09-29 07:00:00  2         2.5    Off  

请你帮助我好吗?提前致谢!

标签: pythonstringdataframetime-series

解决方案


尝试使用以下内容构建您的数据框:

idx = df[df.ne(df.shift(-1)).Status].index
idx2 = pd.cut(df.index, bins=np.append([0], idx), 
                  include_lowest=True, right=True)

df2=pd.DataFrame({
        'Initial_date':df[df.ne(df.shift()).Status].Datetime.values,
        'Final_date':df[df.ne(df.shift(-1)).Status].Datetime.values,
        'Duration':df.groupby(idx2, as_index=False).size().values,
        'Value':df.groupby(idx2, as_index=False).Value.mean().values.flatten(),
        'Status':df.groupby(idx2, as_index=False).Status.first().values.flatten()
        })

在此脚本中,我通过将变量“状态”与同一数据帧的移位版本进行比较来确定变量“状态”何时发生变化。这是通过组合 pandas eqshift函数来完成的。然后使用 pandas cutgroupby函数对数据进行分段,以获得您请求的汇总统计信息(持续时间、平均值和状态)。如果您愿意,这可以很容易地扩展以获得其他有意义的数量(例如标准偏差)。


推荐阅读