繁体   English   中英

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

[英]Python: Reordering a list with many entries

我在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”的方法。

您是否注意到欧洲印刷“ 1980年10月2日”的方式是“ 1980年2月10日”? 您提到的日期顺序只是这些日期的字典顺序。

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

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

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

然后使用大熊猫按照字典顺序对其进行排序:

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

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

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,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

使用它,您可以轻松检索每月同一天的列表:

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...
# ]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM