【问题标题】:Python Pandas select value from column based on timePython Pandas 根据时间从列中选择值
【发布时间】:2021-02-09 05:29:45
【问题描述】:

我是 Python 和 ML 的新手,我正在尝试使用 csv 文件并创建一个模型来预测主机响应的持续时间。

我首先是使用 Pandas 解析 csv 文件中的日志,现在我有 csv 文件,其中的列按以下顺序排列,并带有示例:

                               _time             host  duration
202     2020-09-26T10:56:33.630+0200           malcon       850
203     2020-09-26T10:56:33.630+0200          malcon2       878
703     2020-09-25T21:26:04.651+0200           malcon       973

我想做的第一件事是使用一些模型进行异常检测,但也许有一种更简单的方法来做我想做的事。我想通过时间戳以 3 分钟的间隔获取高于 800 的持续时间值,并根据我拥有一周的数据预测这些值。

我从发现持续时间值高于或等于 800 的代码开始,但不知道如何将它们与时间关联并定义间隔。

到目前为止我的代码是:

import pandas as pd

data = pd.read_csv("example_all.csv")

df = pd.DataFrame(data,columns=['_time','host','duration'])

high = (df.loc[df['duration'] >= 800])

print(high) 

任何提示和建议将不胜感激!谢谢!

更新:

我正在尝试使用滚动功能,但我认为我没有正确理解它并且我有点迷失了。

按照这里的建议,我使用 to_datetime 函数转换时间戳并按时间对数据进行排序。不幸的是,我找不到指定持续时间高于 800 分钟的 3 分钟时间间隔的方法。

我的代码现在看起来像这样:

import pandas as pd

data = pd.read_csv("example_all.csv")

data["_time"] = pd.to_datetime(data["_time"], utc='true')

df = pd.DataFrame(data,columns=['_time','host','duration'])

df.sort_values('_time')

high = (df.loc[df['duration'] >= 800])

print(high)

输出:

                                  _time             host  duration
202    2020-09-26 08:56:33.630000+00:00           malcon       850
203    2020-09-26 08:56:33.630000+00:00          malcon2       850
702    2020-09-25 19:26:05.573000+00:00           malcon       878
703    2020-09-25 19:26:04.651000+00:00           malcon       973
704    2020-09-25 19:26:03.667000+00:00           malcon       993
...

【问题讨论】:

  • 签出df.rolling()
  • 如果我理解您想要做的是识别三个连续样本的持续时间超过 800 的所有实例。如果这是正确的,您需要 (1) 使用 to_datetime 将您的 _time 转换为 pandas 时间戳,(2) 使用 sort 或 sort_values 按时间对数据进行排序 (3) 像您所做的那样按持续时间 > 800 过滤您的数据帧。外观滚动或转变
  • 非常感谢大家,我今天会尝试这样做并在这里分享我的见解。

标签: python python-3.x pandas machine-learning


【解决方案1】:

如果您正在寻找任何值 >= 800,而您在前 3 分钟内没有记录任何

import pandas as pd
from pandas.tseries.offsets import Minute

data = pd.read_csv("example_all.csv", parse_dates=[0])

data = data.sort_values('_time')


def all_over_800(values):
    return values.map(lambda x: x >= 800).all()


data['over_threshold'] = data[['_time', 'duration']].rolling(
    Minute(3), on='_time').apply(lambda win: all_over_800(win))['duration']

请注意,center 窗口选项未针对日期时间偏移窗口实现,因此检查前 3 分钟(或后续取决于顺序)是此方法的唯一选项。如果您不介意对数据框进行两次排序,您可以结合前面和后面的结果来检查样本的两侧。

【讨论】:

  • 感谢您的回复!我正在尝试您的代码,但出现值错误:“ValueError:窗口必须是整数”。为什么滚动抱怨日期格式并需要整数?
  • 我已经用 pandas 1.0 和 pandas 1.1.3 测试了我的答案中的确切代码,它在两种情况下都可以正常工作,并且从 pandas 0.19 开始无论如何都支持日期时间偏移。所以恐怕我不知道你可能遇到什么问题。
  • 如果您没有完全复制并粘贴我的答案中的代码,那么问题可能是_time coumn 不是您数据框中的日期时间。在我的示例中,它通过read_csv 方法中的parse_dates 参数读取为日期时间列。
  • 我粘贴的代码会添加一个新列,告诉你当前行的值是否超过 800,而前面 3 中没有其他值 under 800分钟。在此之后,您可以对数据框做任何您需要的事情,如果您在写入 CSV 时遇到问题,我认为您可能应该问一个新问题。尝试print(data) 了解其中的数据。
  • 请注意,我粘贴的代码不会过滤数据框。如果您只想将感兴趣的样本保留在 3 分钟的间隔内,那就有点复杂了,据我所知,这会迫使您进行两次排序以获得前进和后退窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 1970-01-01
相关资源
最近更新 更多