首页 > 解决方案 > 按日期过滤 pandas 数据帧以计算节目时间线的观看次数

问题描述

我需要按程序计算来自 json 日志文件的流媒体频道的观众人数。我通过它们的开始时间来识别程序,例如:

到目前为止,我有两个这样的数据框:

第一个包含日志文件中的所有时间戳

viewers_from_log = pd.read_json('sqllog.json', encoding='UTF-8')
# Convert date string to pandas datetime object:
viewers_from_log['time'] = pd.to_datetime(viewers_from_log['time'])

在此处输入图像描述

源 JSON 文件:

[
    {
        "logid": 191605,
        "time": "0:00:17"
    },
    {
        "logid": 191607,
        "time": "0:00:26"
    },
    {
        "logid": 191611,
        "time": "0:01:20"
    }
]

第二个包含节目的开始时间和标题

programs_start_time = pd.DataFrame.from_dict('programs.json', orient='index')

在此处输入图像描述 源 JSON 文件:

{
    "2019-05-29": [
        {
            "title": "\"Amiről a kövek mesélnek\"",
            "startTime_dt": "2019-05-29T00:00:40Z"
        },
        {
            "title": "Koffer - Kedvcsináló Kul(t)túrák Külföldön",
            "startTime_dt": "2019-05-29T00:22:44Z"
        },
        {
            "title": "Gubancok",
            "startTime_dt": "2019-05-29T00:48:08Z"
        }
    ]
}

所以我需要做的是统计日志文件中的条目/程序并将它们链接到程序标题。

标签: pythonpandasdataframedata-sciencedata-analysis

解决方案


我的方法是从程序数据中分割每个日期范围的日志数据并获取形状。接下来为程序数据添加列和结果:

import pandas as pd

# setup test data
log_data = {'Time': ['2019-05-30 00:00:26', '2019-05-30 00:00:50', '2019-05-30 00:05:50','2019-05-30 00:23:26']}
log_data = pd.DataFrame(data=log_data)

program_data = {'Time': ['2019-05-30 00:00:00', '2019-05-30 00:22:44'],
            'Program': ['Program 1', 'Program 2']}
program_data = pd.DataFrame(data=program_data)


counts = []
for index, row in program_data.iterrows():
    # get counts on selected range
    try:
        log_range = log_data[(log_data['Time'] > program_data.loc[index].values[0]) & (log_data['Time'] < program_data.loc[index+1].values[0])]
        counts.append(log_range.shape[0])
    except:
        log_range = log_data[log_data['Time'] > program_data.loc[index].values[0]]
        counts.append(log_range.shape[0])

 # add aditional column with collected counts
 program_data['Counts'] = counts

输出:

                  Time    Program  Counts
 0  2019-05-30 00:00:00  Program 1       3
 1  2019-05-30 00:22:44  Program 2       1

推荐阅读