如何使用python读取具有JSON功能的csv文件

2024-04-19 16:52:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv文件,其中包含一个JSON特性,如下面的dataframe所示

id |日期|会议

001 | 29/8/2019 | [{"start":451;"end":459;"duration":13};{"start":522;"end":528;"duration":11};{"start":568;"end":575;"duration":12};{"start":595;"end":604;"duration":14};{"start":1194;"end":1210;"duration":21}]

002 | 27/8/2019 | [{"start":64;"end":65;"duration":6};{"start":451;"end":456;"duration":10};
{"start":513;"end":516;"duration":8};{"start":537;"end":541;"duration":9};{"start":1208;"end":1215;"duration":12};{"start":1367;"end":1368;"duration":6}]
  • 定义:

Hour01:一天中第一个小时内的会话持续时间(分钟),从0001小时到0100小时。 Hour02:一天中第2小时内的会话持续时间(以分钟为单位),从0101小时到0200小时。等等 . . Hour23:一天中24小时内的会话持续时间(以分钟为单位),从2301小时到2400小时

  • 注1:每天从“0”分钟开始,到“1440”分钟结束
  • 注2:在每个活动会话的开始处添加额外的“5分钟”
  • 注3:会议被视为VALID only WHEN {session minutes in {duration} is > 9 minutes}
  • 注4:对于<;=9分钟,它们将被忽略,分钟的持续时间将被丢弃

在场景1中,我们读取“会话”-{"start"":451;""end"":459;””duration””:13;}中的第一行,该行显示活动在第451分钟开始,在第459分钟结束==>;这导致该用户ID{}在该日期{}的{Hour of day}有{}8分钟的活动

a.第451分钟从“第8小时”开始,第459分钟在“第8小时”结束。因此,对于该用户,“8分钟”的活动总数被读取为“8小时”(如下所示)。 b、 我们在每个活动会话的第一个时段(初始小时)中添加额外的“5分钟”。{8+5}13分钟分配给“8小时”(而不是8分钟),如下输出所示。 这是一个有效会话,将捕获13分钟的持续时间。(在应用上述注释2和3后)

  1. 同样,我们分配所有段{Session},并将它们映射到正确的时间

对于场景2,当会话跨越两个或多个连续小时时:

  1. 从第四次会议的上述示例中,{""start"":595;""end"":604;""duration"":14}。 i、 这项活动持续了两个多小时。 ii.会议记录“595至600”分配给“10小时”和;“600至604”至“11小时”。 (注2和3适用于每个会话)

2.每小时的总分钟数{Hr1…Hr24}根据“预期输出”推导并制成表格

完全无法将上面的csv和JSON值以以下格式放置: 预期–输出{按照以下格式}显示1行作为结果示例

ID |   Date  |Hr01|Hr02|Hr03|Hr04|Hr05|Hr06|Hr07|Hr08|Hr09|Hr10|Hr11|.....|Hr24
001|27/8/2019|    |    |    |    |    |    |    | 13 | 11 | 22 | 33 |...
002|26/8/2019|...

如何使用python实现这一点,有什么建议可以帮助我们吗?我在python的新功能方面仍然很弱,如果有人能提供帮助,我会非常感激

谢谢


1条回答
网友
1楼 · 发布于 2024-04-19 16:52:56

这就是你想要的

import re

CSV_FILE = "file.csv"
CSV_OUTPUT_FILE = "output.csv"

file = open(CSV_OUTPUT_FILE, "w")
file.close()

with open(CSV_FILE, "r") as file:
    for line in file:
        if line == "\n":
            continue
        seperaters = [i for i, ltr in enumerate(line) if ltr == "|"]
        id = line[: seperaters[0]].replace(" ", "")
        date = line[seperaters[0] + 1 : seperaters[1]].replace(" ", "")
        raw_data = [int(s) for s in re.findall(r"\d+", line[seperaters[1] + 1 :])]
        Hours = [100 * _ for _ in range(1, 25)]
        hours = [0 for _ in range(24)]
        data = []
        data_temp = []
        for i in range(len(raw_data)):
            if (i + 1) % 3:
                data_temp.append(raw_data[i])
            else:
                data_temp.append(raw_data[i])
                data.append(data_temp)
                data_temp = []
        for H in Hours:
            for d in data:
                if H - 100 <= d[0] <= H and H - 100 <= d[1] <= H:
                    if d[2] >= 9:
                        hours[int(H / 100) - 1] += d[2]
                elif H - 100 <= d[0] <= H and H <= d[1] <= H + 100:
                    if H - d[0] + 5 >= 9:
                        hours[int(H / 100) - 1] += H - d[0] + 5
                    if d[1] - H + 5 >= 9:
                        hours[int(H / 100)] += d[1] - H + 5
        with open(CSV_OUTPUT_FILE, "a") as file:
            file.write(str(id) + "|")
            file.write(str(date) + "|")
            for h in hours:
                if h:
                    file.write(str(h) + "|")
                else:
                    file.write("|")
            file.write("\n")

用您自己的文件替换file.csv

相关问题 更多 >