python - 当字符串更改时,如何在不同的数据框中写入初始日期和最终日期?
问题描述
我是 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
请你帮助我好吗?提前致谢!
解决方案
尝试使用以下内容构建您的数据框:
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 eq和shift函数来完成的。然后使用 pandas cut和groupby函数对数据进行分段,以获得您请求的汇总统计信息(持续时间、平均值和状态)。如果您愿意,这可以很容易地扩展以获得其他有意义的数量(例如标准偏差)。
推荐阅读
- html - 是否可以让 img 标签显示包含其中地址的 svg 图像?
- javascript - 如何在 js/react native 中输入带有弯曲文本的文本?
- c# - 在 C# 中将 JSON 日期和时间转换为普通日期和时间
- javascript - 单击时仅选择对象中的最后一个值
- mysql - brew升级后如何修复缺少的MySQL OpenSSL库?
- javascript - 在 Knex 事务中获取友好的错误消息
- c# - 如何通过 WebSocketSharp 完全发送字节
- apache-spark - Parquet 文件在使用 Hive 时没有来自 String 列的统计信息
- javascript - React Router DOM 无法读取位置状态
- android - 使用 ffmpeg 构建:make: *** 没有规则来制作目标 'jni/../third_party/lame/libmp3lame/VbrTag.c',需要 al/arm64-v8a/objs/lame/VbrTag.o'。停止