读取文件和列表/元组迭代

Reading file and list/tuple iteration

提问人:user159 提问时间:9/7/2023 最后编辑:wjandreauser159 更新时间:9/7/2023 访问量:58

问:

我需要从文件中获取数据,删除以注释哈希开头的行,然后将该文件读入列表。然后将该列表转换为开始时间、结束时间和步数的列表元组。

这是文件:表格 start_time、end_time 和步数(来自 FitBit 数据)

# read from file data about one day 
# format: start_time:end_time:#steps
09.30AM:09.45AM:220
11.45AM:12.23PM:300
11.45AM:10.23AM:302
2.45PM:3.23PM:202
3.45PM:3.53PM:90
5.45PM:5.53PM:80
6.45PM:7.23PM:1000
10.45PM:10.53PM:102

这是我到目前为止拥有的代码,其中包含一个函数,用于读取数据并将其拆分为子列表列表,然后将其拆分为元组。我无法解决的问题是遍历每个开始和结束时间并找到自午夜以来的分钟数。 并将它们存储为整数我无法弄清楚如何遍历子列表中的项目。

import sys

fname = sys.argv[1]

#Lines 26 - 34 reads file "in.dat",removes the comment lines,and stores each of the lines as a seperate tuple list in the form [str , str, str]
data = []
    with open("in.dat", "r") as f:
    for line in map(str.strip, f):
        if line == "" or line.startswith("#"):
            continue
        data.append(line.split(":"))
        data[-1][-1] = int(data[-1][-1])
    print(data)

def minutes_since_midnight(data):
    x = []
    for x in data:
        for y in x:
            y.split(".")
        print(x)**

minutes_since_midnight(data)

def convert_to_tuples(data):
    result = []
    for sublist in data:
        result.append(tuple(sublist))
    return result

result = convert_to_tuples(data)

因此,我的问题再次在于如何将“minutes_since_midnight”函数中的开始时间和结束时间转换为自午夜以来的分钟数。然后使用以下函数将该数据存储到 tules 中。

我是 Python 的新手,因此任何帮助将不胜感激。

预期结果是如下所示的列表 [(570, 585, 220 , ...]

列表 功能 元组 迭 代

评论


答:

0赞 Suraj Shourie 9/7/2023 #1

假设您知道注释行的数量(或者您可以使用代码来查找该数字),则可以使用此pandas

import pandas as pd
# need to specify the seperator and skiprows
df = pd.read_csv(filepath, sep=":", skiprows=2, header=None, names=['start', 'end', 'steps'])

输出:

开始 结束 步骤
上午09:30 上午09:45 220
上午11时45分 中午 12:23 300
上午11时45分 上午10时23分 302
下午2时45分 下午3时23分 202
下午3时45分 下午3时53分 90
下午5时45分 下午5时53分 80
下午6时45分 晚上7点23分 1000
晚上 10:45 晚上 10:53 102

然后,如果需要,可以使用以下方法将其转换为列表df.to_list()

评论

0赞 user159 9/7/2023
不幸的是,我只需要使用内置的 python 操作来完成此操作,而无需使用库或扩展
0赞 richard 9/7/2023 #2

我想我已经看过其他关于这个的帖子,似乎你已经做了几天了。
测试值中的“PM”,然后从时间戳中拆分后,调整小时数。乘以 x 60 并加上自午夜以来的总分钟数。
hours/minshoursmins

from io import StringIO
from pprint import pp


in_dat = """\
# read from file data about one day 
# format: start_time:end_time:#steps
09.30AM:09.45AM:220
11.45AM:12.23PM:300
11.45AM:10.23AM:302
2.45PM:3.23PM:202
3.45PM:3.53PM:90
5.45PM:5.53PM:80
6.45PM:7.23PM:1000
10.45PM:10.53PM:102"""


def mins_since_midnight(arg):
    """ converts HH:MM to minutes by splitting on ':' and adding 12 hours if 'PM' in argument """
    meridiem = True if 'PM' in arg.upper() else False
    hours, mins = list(map(int, arg.strip('AMP').split(':')))
    if meridiem and hours < 12: hours += 12
    return hours * 60 + mins


# with open('in.dat', 'r') as file
with StringIO(in_dat) as file:
    results = []
    for line in file:
        if line.startswith('#'): continue
        start, stop, steps = line.strip().split(':')
        results.append((
            start.replace('.', ':'),
            stop.replace('.', ':'),
            int(steps)
        ))
pp(results)

converted_results = []
for start, stop, steps in results:
    converted_results.append((
        mins_since_midnight(start),
        mins_since_midnight(stop),
        steps
    ))
pp(converted_results)

输出:

[('09:30AM', '09:45AM', 220),
 ('11:45AM', '12:23PM', 300),
 ('11:45AM', '10:23AM', 302),
 ('2:45PM', '3:23PM', 202),
 ('3:45PM', '3:53PM', 90),
 ('5:45PM', '5:53PM', 80),
 ('6:45PM', '7:23PM', 1000),
 ('10:45PM', '10:53PM', 102)]
[(570, 585, 220),
 (705, 743, 300),
 (705, 623, 302),
 (885, 923, 202),
 (945, 953, 90),
 (1065, 1073, 80),
 (1125, 1163, 1000),
 (1365, 1373, 102)]