首页 > 解决方案 > 将时间序列表从字符串提取到字典中

问题描述

我有一个包含几个时间序列数据的文本文件,如下所示:

Elect Price 
(Jenkins 1989)

1960 6.64784
1961 6.95902
1962 6.8534
1963 6.95924
1964 6.77416
1965 6.96237
1966 6.94241
1967 6.50688
1968 5.72611
1969 5.45512
1970 5.2703
1971 5.75105
1972 5.26886
1973 5.06676
1975 6.14003
1976 5.44883
1977 6.49034
1978 7.17429
1979 7.87244
1980 9.20048
1981 7.35384
1982 6.44922
1983 5.44273
1984 4.3131
1985 5.27546
1986 4.99998
1987 5.78054
1988 5.65552

Hydro Electricity 
(Guyol 1969; Energy Information Administration 1995)

1958 5.74306e+009
1959 5.90702e+009
1960 6.40238e+009
1961 6.77396e+009
1962 7.12661e+009
1963 7.47073e+009
1964 7.72361e+009
1980 1.62e+010
1985 1.85e+010
1986 1.88e+010
1987 1.89e+010
1988 1.96e+010
1989 1.95e+010
1990 2.02e+010
1991 2.05e+010
1992 2.04e+010
1993 2.12e+010

Nuclear Electricity
(Guyol 1969; Energy Information Administration 1995)

1958 4.43664e+006
1959 1.34129e+007
1960 2.56183e+007
1961 4.09594e+007
1962 6.09336e+007
1963 1.09025e+008
1964 1.59522e+008
1980 6.40598e+009
1985 1.33e+010
1986 1.42e+010
1987 1.55e+010
1988 1.68e+010
1989 1.73e+010
1990 1.77e+010
1991 1.86e+010
1992 1.88e+010
1993 1.95e+010

我将它作为单个字符串加载,我想知道将其转换为以下形式的字典的最佳方法是什么:

{('Elect Price', '(Jenkins 1989)'): [(1960, 6.64784), (1961, 6.95902), (1962, 6.8534), ...], ...}

我的第一直觉是逐行遍历字符串并检查是否有几个不同的正则表达式匹配并从那里开始,但我还必须包含逻辑来处理匹配变量名后要做什么,然后引文、数据等。

有一个更好的方法吗?可能使用某种模板来提取变量名、引用和数据?我确信这是一个相当普遍的任务,所以我假设有更多的标准方法/工具来解决这个问题。

标签: pythonregexstringtime-series

解决方案


您可以实现内置字符串方法的使用split。首先被两个连续的换行符分割。然后,以两个为一组迭代创建的列表以单独格式化数据,也实现split通过单个换行符进行拆分。具体的格式应该很简单,但会很乏味。

也许是这样的:

def parse_input(s):
    # split by two consecutive newlines
    s = s.split("\n\n")

    out = {}
    for i in range(0, len(s), 2):  # iterate in chunks of two.
        # split key by newline, remove extra spaces, and convert to tuple
        key = tuple(map(lambda x: x.strip(), s[i].split("\n")))
        # split value by newline, split each line by space, and evaluate  
        # each piece of data with the builtin 'eval' function.
        value = list(map(lambda x: tuple(map(eval, x.split())), s[i + 1].split("\n")))
        out[key] = value
    return out

由于我是stackoverflow的新手,请告诉我如何改进我的答案。


推荐阅读