将年份列表分成几十年

时间:2015-07-17 17:37:02

标签: python arrays numpy

我有以下数组:

array([1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971,
       1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982,
       1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993,
       1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
       2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013], dtype=object)

我想将其划分为单独的列表,每十年一次(例如1970-1979是十年)。

现在,我正在循环这些年并分成单独的列表。有更多的pythonic方式去做吗?

2 个答案:

答案 0 :(得分:6)

您可以使用itertools.groupby并将年份除以10。这将基本上分组十年。然后在列表推导中使用它并创建一个新的array

>>> import numpy as np
>>> from itertools import groupby
>>> np.array([list(g) for k,g in groupby(a, lambda i: i // 10)])
array([[1963, 1964, 1965, 1966, 1967, 1968, 1969],
       [1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979],
       [1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989],
       [1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999],
       [2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009],
       [2010, 2011, 2012, 2013]], dtype=object)

请注意,groupby要求对序列进行排序(看起来与您的数据相似)。

答案 1 :(得分:1)

np.floor还有另一个更简单的方法和技巧

    import numpy as np
    years = np.array([1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971,
          1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982,
          1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993,
          1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
          2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013])

    decades = []
    for each in years:
        decade = int(np.floor(each / 10) * 10)
        decades.append(decade)

    print(set(decades))