Python:重新排序包含许多条目的列表

问题描述 投票:0回答:2

我在python中有一个列表,有10,000多个温度条目没有相应的日期。从本质上讲,前12个参赛作品是10月1日,11月1日,9月1日。以下12个参赛作品分别为10月2日,11月2日,9月2日。这一直持续到第31天。

该计划也重复了20年(即1980年至2000年)

相反,我想以更合理的格式组织这些值... 10月1日,2日,3日等。

这样做有简单的方法吗?我试过循环,但没有用。我对编码很新,所以越简单就越好。

###Code to getting the list:###
rawdata = open('')
data = csv.reader(rawdata)
listoflists = []
for i in e1:
    listoflists.append(i)
    print(i)

temperaturelist = []

for sublist in listoflists:
    for item in sublist:
        temperaturelist.append(item)

for i in temperaturelist:
    if i < 13:
        newlist = ...

对不起,这可能是一个存在多个问题的大问题,而不是编码“x”的更优化方法。

python
2个回答
0
投票

你注意到欧洲的印刷方式“1980年10月2日”是“2/10/1980”吗?你提到的日期顺序只是这些日期的词典排序。

如果是这种情况,您可以尝试以下方法:

首先生成所有日期(您必须确保您的数据完全是这些日子,不多也不少):

import datetime
d0 = datetime.date(1980, 1, 1)
dN = datetime.date(2000, 12, 31)
delta = datetime.timedelta(days = 1)

dates = []
printdates = []
d = d0
while d <= dN:
    dates.append(d)
    printdates.append("{d.day}/{d.month}/{d.year}".format(d=d))
    d = d + delta

然后使用pandas按字典顺序对它们进行排序:

import pandas as pd
date_df = pd.DataFrame({'print_date': printdates,
                        'date': dates}
                      ).sort_values("print_date")

现在转到您的CSV数据。使用pandas加载它们,分配日期列,然后按实际日期排序:

csv_df = pd.read_csv(...)
csv_df["print_date"] = date_df["print_date"]
csv_df["date"] = date_df["date"]
csv_df = csv_df.sort_values("date")

我没有测试这些代码。可能有错误。但我希望你能得到这个概念。


0
投票

如果我理解得很好,从最初的清单......

  • 第一年,......的价值 第一个月应该是索引[0,12,24,...,360] 第二个月应该是指数[1,13,25,...,361] ... 上个月应该是指数[11,23,35,...,371]
  • 第二年,......的价值 第一个月应该是索引[372,384,396,...,732] ...

您可以先创建一个实用程序迭代器,它返回可配置大小的子列表:

def iter_by(length, some_iterable):
    iterator = iter(some_iterable)
    while True:
        dozen = [next(iterator) for _ in range(length)]
        yield dozen

使用它,你可以esealy检索每月同一天的列表:

plenty_of_values = range(20 * 12 * 31)  # 20 years, 12 months, 31 days 
same_month_day_list = list(iter_by(12, plenty_of_values))
# [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
#  [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
#  [24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35],
#  etc...]

这相当于:

  • 第一年,第一天
  • 第一年,第二个月
  • ...
  • 第一年,第31个月
  • 第二年,第一天
  • ...

然后,您可以按31块的方式压缩这些列表,以获得连续每年连续几个月的连续天数列表​​:

ordered_years = [list(zip(*year)) for year in iter_by(31, ame_month_day_list)]
# [[(0, 12, 24, 36, ..., 360),
#   (1, 13, 25, 37, ..., 361),
#   (2, 14, 26, 38, ..., 362),
#   (3, 15, 27, 39, ..., 363),
#   (4, 16, 28, 40, ..., 364),
#   (5, 17, 29, 41, ..., 365),
#   (6, 18, 30, 42, ..., 366),
#   (7, 19, 31, 43, ..., 367),
#   (8, 20, 32, 44, ..., 368),
#   (9, 21, 33, 45, ..., 369),
#   (10, 22, 34, 46, ..., 370),
#   (11, 23, 35, 47, ..., 371)],
#  [(372, 384, ..., 732),
#   (373, 385, ..., 733),
#   ...
#   (383, 395, ..., 743)],
#  [(744, 756, ..., 1104),
#   (745, 757, ..., 1105),
#   ...
#   (755, 767, ..., 1115)],
#   etc...
# ]

结果是一个列表,其中包含每年的列表。每年列表包含每个月的元组。每个月包含每天的值。整个想法是临时的。

© www.soinside.com 2019 - 2024. All rights reserved.