【问题标题】:Transpose .csv File: changing Header Time Stamps to Line TimeStamp转置 .csv 文件:将标头时间戳更改为行时间戳
【发布时间】:2015-09-24 07:34:18
【问题描述】:

我的数据如下所示:

statnr      datum       ele h01    h02    h03    h04    h05    h06    h07    h08    h09    h10    h11    h12    h13    h14    h15    h16    h17    h18    h19    h20    h21    h22    h23    h24    
----------- ----------- --- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ 
   20101    20020401    D6K    103    126    115    114    105    101    118    118    130    129    126    128    132    133    131    130    130    131    130    130    125    117    122    124 
   20101    20020402    D6K    126    118    119    120    114    111    107    119    124    126    122    130    130    130    128    128    126    119    129    134    132    127    112    118 
   ........
   20101    20150909    D6K     72     82     75     76     82     93     91     96     99    101    108    108    103    100     94     90     82     92     88     79     77     89     94     92
   20101    20020401    FLP     54     61     58     61     66     67     65     56     47     46     40     40     39     32     34     34     37     43     45     45     50     54     59     63 
   20101    20020402    FLP     64     61     67     66     68     69     67     56     50     46     42     39     33     32     33     34     39     48     55     58     61     62     65     68 
   ........
   20101    20150909    FLP     93     95     92     94     94     96     95     92     90     84     87     75     81     75     75     74     83     87     89   96     94     92     91     94 
   20101    20070906    GSE  32700      0      0      0      0      0      3     10     17     30     28     27     37     44     37     25     16      5      1      0      0      0      0      0 
   20101    20070907    GSE      0      0      0      0      0      0     11     48     72    107    257    264    290    216    255    178    122     57      6      0      0      0      0      0 
   ........
   20101    20150909    GSE      0      0      0      0      0      1     17     51     71    118     82    200    116    130    142    156     48     15      1      0      0      0      0      0 
   20101    20020101    SUV      0      0      0      0      0      0      0      0      9     10     10     10     10     10     10     10      2      0      0      0      0      0      0      0 
   ........
   20101    20150909    SUV      0      0      0      0      0      0      0      0      0      1      0      5      1      4      4      9      2      0      0      0      0      0      0      0
   20101    20020401    TEX     30     18     21     18      9     10     18     42     69     91    114    117    126    135    133    127    114     87     58     47     39     33     27     24 
   ........
   20101    20150909    TEX     50     46     48     50     50     49     57     67     77     85     80    111     95    100    101     92     74     67     59     53     49     49     49     47 
   20101    20020401    QVX      6     10      9      8     13     25     19     15     16     19     24     24     19     23     24     22     24     23     19     13     12     16     16     18 
   ........
   20101    20150909    QVX     40     42     37     34     30     34     22     22     27     31     26     28     37     38     42     43     52     54     59     81     80     69     78     60 

如您所见,它是一个巨大的表格,其中包含 statnr Row、DateRow、ele 代表参数,而 h01 - h24 是您可以想象的小时数。 我需要将该工作表的格式调整为我正在使用的其他文件的格式(绘图和处理原因)

我目前正在尝试将此 FileSheet 转换为这种格式:

Date        Time    D6K FLP GSE SUV TEX QVX 
01.04.2002  01:00   103 54      0    30 6
.....
09.09.2015  23:59   92  94   0  0    47 60

所以我想做的是:

1) 去掉 row[0] (statnr)

2) 用 Row[2] 切换 Header 以便所有参数都在 header 中并将它们链接到行中的新 Time Date fmt

3) 将时间 fmt 从 %H%M%D 转换为 %D%M&Y %H:%M

由于我是 python 和编码的新手,我想我会问是否有一个包可以处理这种问题,以及是否有一个通用术语来表示该问题(用行切换标题) - -> 谢谢(彼得伍德)我把标题换成了转置

感谢您的建议

澄清: ........ 表示我遗漏了一些行 ----------- 在文件中

【问题讨论】:

  • 这个词是transpose
  • 不是重复的——转换比简单的换位要复杂得多。
  • ........ 行是否表明您已经剪掉了一些具有相同 ele 值的行以便向我们展示结构,或者这些行实际上是否在您的数据中?对于ele 的每个值,您的数据集是否总是包含相同的日期集,或者其中一些可能会丢失?最后,这只是一次性的,还是您需要编写代码才能在多个文件上执行此操作?
  • 不,这表明我已经删除了一些行。某些值可能会丢失。例如,对于 GSE 参数,该时间序列从 20070907 开始,而对于其他时间序列,它从 20020401 开始,在这之间,值肯定有一些缺失的日期

标签: python csv


【解决方案1】:

因为您可能缺少数据,所以这不是转置块的简单情况。我认为您需要做的是将输入文件读入数据结构,然后您可以从中查找所需的值以生成输出。在 Python 中,您可以使用 dictionary,其键是元素类型、日期和小时的元组:

mydict = {}

with open('F:\myfile.txt') as f:
    z = f.readline() # discard headings
    z = f.readline() # discard row of dashes
    for line in f:
        fields = line.split()
        date = fields[1]
        ele = fields[2]
        for hour, value in enumerate(fields[3:27]):
            mydict[(ele, date, hour)] = value

现在,您拥有一个大字典中的所有数据,可以通过 eledatehour 寻址。我猜ele 值是固定的,您可以对其进行硬编码,但您需要构建一个您在输入文件中实际找到的唯一日期的列表,并将它们按升序排列:

dateset=set()
for k in mydict.keys():
    dateset.add(k[1])
dates=list(dateset)
dates.sort()

现在您已准备好构建输出文件。

for date in dates:
    for hour in range(24):
        output = date + '\t' + hour
        for ele in ['D6K', 'FLP', 'GSE', 'SUV', 'TEX', 'QVX']:
            output = output + '\t' + mydict.get((ele, date, hour), '')
    print(output)

在字典中使用get 方法允许您指定在您提供的键不在字典中时要返回的默认值。

我还没有处理日期格式(请注意,“小时”的范围从 0 到 23),或者将输出写入文件,但以上内容应该可以帮助您。

【讨论】:

  • 我将output = date + '\t' + hour 编辑为output = str(date) + '\t' + str(hour) 它让我走得很远,但不知怎的,时间还没有到达输出:20130209 23 309 60 0 0 -106 2620130210 23 280 82 0 0 -119 35
  • 当然还有更多的输出......只是一个小样本
  • hour 在我的代码中将只是一个介于 0 和 23 之间的整数,它来自 enumerate 函数。输出中的第二项不是小时值吗? 0 对应于您的 h01 列等。我敢肯定,您可以弄清楚如何将其转换为您选择的格式的时间。
  • 我更正了答案中的一些缩进,请检查这是否是您的问题。
  • 不确定是什么给了你第一行,但听起来好像一个流氓空白值正在以某种方式进入dates 列表 - 以交互方式运行代码或print 一些变量的值你继续看看发生了什么。我肯定会用一个小数据集测试这段代码,并检查所有数据是否都在正确的位置!您可以使用字符串操作来实现日期和时间格式,例如如果z20110822 然后z[6:8]+'.'+z[4:6]+'.'+z[0:4] 给你22.08.2011,等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
  • 2013-04-07
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多