2

我有一个数据文件,其中包含如下值:

@ DD MM YYYY HH MN SS Hs Hrms Hma x Tz Ts Tc THmax EP S T0 2 Tp Hrms EPS

29 11 2000 13 17 56 2.44 1.71 3.12 9.12 11.94 5.03 12.74 .83 8.95 15.03 1.80 .86
29 11 2000 13 31 16 2.43 1.74 4.16 9.17 11.30 4.96 11.70 .84 8.84 11.86 1.80 .87

我使用以下内容获取数据:

infile = open ("testfile.txt", 'r')
data = np.genfromtxt(infile,skiprows=2) 

这给了我一个 numpy.ndarray

我希望能够将前 0-5 列解释为时间戳 (DD:MM:YYY:HH:MN:SS),但这是我被难住的地方 - 似乎有一百万种方法可以做到这一点,我不知道什么是最好的。

我一直在研究 dateutil 和 pandas - 我知道我应该做一些非常明显的事情,但我不知所措。我应该先转换为 csv 格式吗?使用for循环以某种方式连接每行(cols 0-5)的值?

在此之后,我将根据时间戳/增量绘制来自其他列的值。

我对python完全陌生,所以任何指针表示赞赏:)

4

4 回答 4

2

这里有一个pandas解决方案:

测试.csv:

29 11 2000 13 17 56 2.44 1.71 3.12 9.12 11.94 5.03 12.74 .83 8.95 15.03 1.80 .86
29 11 2000 13 31 16 2.43 1.74 4.16 9.17 11.30 4.96 11.70 .84 8.84 11.86 1.80 .87

pandas提供一个read_csv 工具来读取 csv,你应该提供以下参数来解析你的文件:

  1. delimiter:默认是逗号,所以需要设置为空格
  2. parse_dates:那些日期列(顺序敏感)
  3. date_parser:默认为dateutil.parser.parse,但似乎不适用于您的情况,因此您应该实现自己的解析器
  4. 标题:如果您的 csv 没有列名,则应将其设置为None

最后,这里是示例代码:

In [131]: import datetime as dt

In [132]: import pandas as pd

In [133]: pd.read_csv('test.csv', 
                       parse_dates=[[2,1,0,3,4,5]], 
                       date_parser=lambda *arr:dt.datetime(*[int(x) for x in arr]),
                       delimiter=' ', 
                       header=None)
Out[133]:
          2_1_0_3_4_5     6     7     8     9     10    11     12    13    14  \
0 2000-11-29 13:17:56  2.44  1.71  3.12  9.12  11.94  5.03  12.74  0.83  8.95
1 2000-11-29 13:31:16  2.43  1.74  4.16  9.17  11.30  4.96  11.70  0.84  8.84

      15   16    17
0  15.03  1.8  0.86
1  11.86  1.8  0.87
于 2013-06-26T06:44:08.400 回答
1

我会这样做:

from datetime import datetime

# assuming you have a row of the data in a list like this
# (also works on ndarrays in numpy, but you need to keep track of the row, 
#  so let's assume you've extracted a row like the one below...)
rowData = [29, 11, 2000, 13, 17, 56, 2.44, 1.71, 3.12, 9.12, 11.94, 5.03, 12.74, 0.83, 8.95, 15.03, 1.8, 0.86] 

# unpack the first six values
day, month, year, hour, min, sec = rowData[:6] 
# create a datetime based on the unpacked values
theDate = datetime(year,month,day,hour,min,sec)

无需将数据转换为字符串并对其进行解析。查看datetime 文档可能会很好。

于 2013-06-26T06:33:59.910 回答
0

我对 numpy 几乎一无所知,但您可以使用该datetime模块将日期转换为日期对象:

import datetime
line = "29 11 2000 13 17 56 2.44 1.71 3.12 9.12 11.94 5.03 12.74 .83 8.95 15.03 1.80 .86"
times = line.split()[:6]

现在从这里你有两个选择:

print ':'.join(times)
# 29:11:2000:13:17:56

或者,正如我之前所说,使用 datetime 模块:

mydate = datetime.datetime.strptime(':'.join(times), '%d:%m:%Y:%H:%M:%S')
print datetime.datetime.strftime(mydate, '%d:%m:%Y:%H:%M:%S')
# 29:11:2000:13:17:56

当然,您可能认为第二个选项没有用,但如果您想从日期中获取更多信息(例如年份),那么最好将其转换为日期时间对象。

于 2013-06-26T06:29:26.737 回答
0
import datetime
import re

import numpy as np

def convert_to_datetime(x):
    return datetime.datetime.strptime(x, '%d:%m:%Y:%H:%M:%S')

infile = open("testfile.txt", 'r')
infile = (re.sub(r'^(\d+) (\d+) (\d+) (\d+) (\d+) (\d+)', r'\1:\2:\3:\4:\5:\6', line, 1) for line in infile)
data = np.genfromtxt(infile, skiprows=2, converters={0: convert_to_datetime})
于 2013-06-26T07:40:07.703 回答