添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

如何用Python计算CSV文件中两个特定日期时间的总持续时间(可能出现多次)?

1 人不认可

我正在处理一个关于自动售货机的日志信息的CSV文件样本。(对熊猫来说是非常新的)。每天都会有人通过扫描瓶子上的二维码将饮料重新装入机器。我需要解决以下问题。

问:将所有饮料重新装入机器的总时间是多少?

你可以在下面找到我的示例代码和CSV文件样本。

import pandas as pd
filePath = '~/sample.csv'
df = pd.read_csv(filePath)
print(df.head(10))

关于每一列的类型的信息 df.dtypes

  • timestamp --> datetime64[ns]
  • event --> object
  • value --> object
  • 以下是我解决这个问题的想法。

  • 会有很多事件状态,但我只需要关注事件=='qc_scan'。 和值列=='已进入'或'已退出'(由于可能有一个值=='错误')。

    因此,对于每个装载瓶的持续时间等于。

    qc_scan_starttime = df[event == 'qc_scan' & value == 'Entered'] #corrsonpidng timestamp
    qc_scan_endtime = df[event == 'qc_scan' & value == 'Exited'] #corrsonpidng timestamp
    each_duration = qc_scan_endtime - qc_scan_endtime
    
  • 然后循环浏览整个数据框,并将每个持续时间相加。

  • 将持续时间保存为新的列名 "持续时间"(单位:分钟)。

  • 最终保存为一个新的CSV文件,包含持续时间信息

    但是,我不确定如何在CSV文件中使用python pandas写一个for循环。谁能给我提供一个示例代码?

  • python
    pandas
    numpy
    csv
    Lawrence
    Lawrence
    发布于 2021-12-23
    1 个回答
    ZiY Chen
    ZiY Chen
    发布于 2021-12-23
    已采纳
    0 人赞同

    根据你的问题描述,我认为你不需要创建一个新的栏目。你可以通过以下方式实现你的目标。

  • loop through the dataframe
  • find the duration between each event == 'qc_scan' & value == 'Entered' and event == 'qc_scan' & value == 'Exited'
  • sum the duration
  • 可能存在一些使用特殊pandas函数的解决方案,但我建议从最简单的方法开始。就是说。

  • you can use iterrows to iterate the df ( ref ). The syntax will look like this:
  • for _, row in df.iterrows():
        event, value = row["event"], row["value"]
        if event == "qc_scan":
            # do something
    
  • And in the # do something part, you will need to store every duration seconds between an Entered and an Exited. That would be something like
  • qc_scan_starttime = None
    if value == "Entered":
        qc_scan_starttime = df["timestamp"]
    elif value == "Exited":
        if qc_scan_starttime is not None:
            duration = df["timestamp"] - qc_scan_starttime
            total_duration += duration
            qc_scan_starttime = None
    

    In the end, the whole solution would be

    total_duration = 0
    qc_scan_starttime = None
    for _, row in df.iterrows():
        event, value = row["event"], row["value"]
        if event == "qc_scan":
            if value == "Entered":
                qc_scan_starttime = df["timestamp"]
            elif value == "Exited":
                if qc_scan_starttime is not None: