如何将.text数据文件中的值解释为时间系列

时间:2013-06-26 06:05:46

标签: python pandas timestamp python-dateutil

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

  

@ 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 个答案:

答案 0 :(得分:2)

以下是pandas解决方案:

test.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 util来读取csv,你应该给出以下参数来解析你的文件:

  1. 分隔符:默认值为逗号,因此您需要将其设置为空格
  2. parse_dates:那些日期列(订单敏感)
  3. date_parser:默认为dateutil.parser.parse,但似乎它不适用于您的情况,因此您应该实现自己的解析器
  4. 标头:如果您的csv没有列名,则应将其设置为None
  5. 最后,这里是示例代码:

    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
    

答案 1 :(得分: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 documentation

答案 2 :(得分: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

当然,您可能认为第二个选项没用,但如果您想要更多来自日期的信息(例如年份),那么最好将它转换为日期时间对象。

答案 3 :(得分: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})