019—pandas 计算实验仪器正常运行周期时长

需求:

对指定两个状态作为一个周期,并计算出周期内的差值,写到周期结束所在的行上。pandas 非常适合实现此类有着较为复杂逻辑的问题。

思路:

  • 这个问题的难点是状态的不规律性,如何才能准确找出所有 T 和 C 的周期。
  • 我们可以先将状态 T 和 C 筛选出来,然后剔除连续的 T 或者 C 中的无效的内容,最终形成一个规范的 T-C 列表。
  • 在规范的列表中求位差,最终保留 C 位置的值并增加 Delta 列。

使用步骤:

1.引入库

代码如下(示例):

python 复制代码
import pandas as pd

2.读入数据

代码如下(示例):

python 复制代码
df=pd.DataFrame(columns=['Status','t'])

df['Status']=['A','T', 'A','C','C','A','T','T','C','A']
df['t']= pd.to_datetime(['2021-06-12 08:39:24.813000',
'2021-06-12 08:39:24.820000',
'2021-06-12 08:39:25.210000',
'2021-06-12 08:39:25.217000',
'2021-06-12 08:44:28.830000',
'2021-06-12 10:48:10.293000',
'2021-06-12 10:48:10.300000',
'2021-06-12 10:48:10.680000',
'2021-06-12 10:48:10.693000',
'2021-06-12 10:48:11.223000'])

df
# 其中,状态列我们关注的是状态 T 和 C,T 表示机器触发开始运行,C 表示出现故障。需求期望增加 Delta 列来计算显示 T(触发)和 C(结束)状态之间的时间差,并将这个时间差显示在 C 对应的列上。
# 需要注意的是,状态 C 之后不经过 T 还可能出现状态 C,我们视 T 之后到第一个 C 之间为一个正常运行周期。
python 复制代码
#增加两个辅助列,是不当前行的当是 T 下行是 C,是否当前行是 C 上行是 T:
(
    df.loc[df.Status.isin(['T', 'C'])]
    .assign(nxt_C=lambda x: (x.Status == 'T') | (x.Status.shift() == 'C'))
    .assign(pre_T=lambda x: (x.Status == 'C') | (x.Status.shift(-1) == 'T'))
)
python 复制代码
#我们筛除两个辅助列分别为 True 之外的数据:
(
    df.loc[df.Status.isin(['T', 'C'])]
    .assign(nxt_C=lambda x: (x.Status == 'T') | (x.Status.shift() == 'C'))
    .assign(pre_T=lambda x: (x.Status == 'C') | (x.Status.shift(-1) == 'T'))
    .loc[lambda x: ~((x.nxt_C==True) & (x.pre_T==True))]
)
python 复制代码
#最后求时间列的位差:
temp = (
    df.loc[df.Status.isin(['T', 'C'])]
    .assign(nxt_C=lambda x: (x.Status == 'T') | (x.Status.shift() == 'C'))
    .assign(pre_T=lambda x: (x.Status == 'C') | (x.Status.shift(-1) == 'T'))
    .loc[lambda x: ~((x.nxt_C== True) & (x.pre_T==True))]
    .assign(Delta=lambda x: x.t - x.t.shift())
)
temp
# 这样就得到的数据状态 C 对应的 Delta 值就是我们要的数据。
python 复制代码
#接下来,将这些数据写入原 df,我们采用了迭代的方式:
for index, row in temp.query('Status=="C"').iterrows():
    df.loc[index, 'Delta'] = row.Delta
df

总结

以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

相关推荐
小大宇15 小时前
python pandas dataFrame sqlAlchemy案例
python·pandas
chouchuang2 天前
day-040-Pandas可视化与实战
pandas
chouchuang5 天前
day-037-Pandas数据读取
pandas
benchmark_cc6 天前
如何用 Python 进行多周期 K 线合成与时区对齐?基于 QuantDash 与 Pandas 的量化数据清洗实战(附 GitHub 源码)
开发语言·python·github·盯盘·pandas·quantdash·量化数据
梅雅达编程笔记7 天前
零基础学 Python 第14章 | 模块、包与第三方库
开发语言·python·django·numpy·pandas
梅雅达编程笔记7 天前
零基础学 Python 第15章 | 类与对象:面向对象编程入门
开发语言·python·django·numpy·pandas
benchmark_cc8 天前
Python 量化核心基础:前复权、后复权与不复权有什么区别?基于 QuantDash 的数据处理与回测避坑指南
开发语言·python·pandas·量化策略·量化交易·quantdash
人工干智能8 天前
科普:Pandas 索引器 loc 与 iloc 的编程思维
java·人工智能·pandas
梅雅达编程笔记8 天前
编程启蒙|Scratch 转 Python 系列第9天:字典/哈希表积木双向对照(AI大模型参数配置表实战)
开发语言·人工智能·python·numpy·pandas
benchmark_cc9 天前
用 Streamlit + QuantDash 10分钟拼装一个跨市场持仓风险与相关性诊断面板
开发语言·python·pandas·量化策略·量化交易·quantdash