Python CSV文件,比较时间段

时间:2017-10-01 10:43:10

标签: python python-2.7 csv time

链接到CSV文件:https://www.emcsg.com/marketdata/priceinformation [我下载了72个句点的CSV文件。每天下午12点 - UTC + 08:00,它有一个新文件,显示当天的价格和价格预测,直到第二天的上午12点。]

我试图显示能量(USEP / $ MWh)低于每天平均值的日期和时间。

for line in lines:
    try:
        time = line.split(",")[1][1:-1]
        interval = line.split(",")[0][1:-1]
        item = line.split(",")[4][1:-1] #Choose 4th column and delete ""
        if interval == next_day:
          if float(item) < average:
              print interval, time, float(item)

    except:
        pass           #If it can't parse, the string is not a number

上面的代码打印出类似这样的内容

30 Sep 2017 01:00-01:30 84.14
30 Sep 2017 01:30-02:00 84.12
30 Sep 2017 02:00-02:30 85.11
30 Sep 2017 02:30-03:00 83.49
30 Sep 2017 03:00-03:30 80.66
30 Sep 2017 03:30-04:00 75.69
30 Sep 2017 04:00-04:30 72.45
         .
         .  
         .
30 Sep 2017 21:30-22:00 79.72
30 Sep 2017 22:00-22:30 73.23
30 Sep 2017 22:30-23:00 73.58
30 Sep 2017 23:00-23:30 72.14
30 Sep 2017 23:30-00:00 85.21

显示能源价格低于9月30日平均值的日期和时间。

但是我想打印那样的东西

30 Sep 2017 01:00-04:30
30 Sep 2017 21:30-00:00

基本上我想把它们分组,因为时间是连续的。一旦中断(在此期间,价格高于平均水平),当价格低于平均值时,它将在下一个“期间”打印一个新行。

我在考虑比较每个'时段'的结束时间(例如01:00-01:30,01:30是结束时间)和下一个时段的开始时间(例如01:30-02:00) ,01:30是下一行的开始时间),但我不确定它是否可行。

提前谢谢!(:

1 个答案:

答案 0 :(得分:1)

长期以来,这必须是我的最丑陋的代码之一。 但也许你的意思是这样的? 有些人认为这可能直接用熊猫来完成。

import pandas as pd

url = "https://www.emcsg.com/marketdata/priceinformation?downloadRealtime=true"
df = pd.read_csv(url)

average = df["USEP($/MWh)"].mean()
output = []
entry = 0
old = None

# Starts a loop 
# (if average changes from bigger to lower or vice versa 
# create new entry in the output list)
for k,v in df.iterrows():  

    # First entry
    if not old:
        output.append([])
        output[entry].append(v["Period"])
        if v["USEP($/MWh)"] > average:
            old = "bigger"
            output[0].append(old)
        else:
            old = "smaller"
            output[entry].append(old)
        output[entry].append(v["USEP($/MWh)"])
        continue

    # The rest
    if v["USEP($/MWh)"] > average:
        new = "bigger"
    else:
        new = "smaller"

    if new == old:
        output[entry][0] = output[entry][0].split("-")[0]+"-"+v["Period"].split("-")[1]
        output[entry][2] += v["USEP($/MWh)"]
    else:
        entry += 1
        output.append([])
        output[entry].append(v["Period"])
        output[entry].append(new)
        output[entry].append(v["USEP($/MWh)"])

    old = new

输出如下:

[['12:00-15:30', 'bigger', 503.52],
 ['15:30-18:30', 'smaller', 423.78],
 ['18:30-00:00', 'bigger', 839.39],
 ['00:00-10:00', 'smaller', 1372.4700000000003],
 ['10:00-11:30', 'bigger', 215.90999999999997],
 ['11:30-13:00', 'smaller', 211.83000000000004],
 ['13:00-17:00', 'bigger', 576.4200000000001],
 ['17:00-20:30', 'smaller', 486.94],
 ['20:30-22:00', 'bigger', 227.11],
 ['22:00-00:00', 'smaller', 271.34000000000003]]