簡體   English   中英

從txt文件到數組的時間戳

[英]timestamp from a txt file into an array

我有一個具有以下結構的txt文件:

"YYYY/MM/DD HH:MM:SS.SSS val1 val2 val3 val4 val5'

第一行如下所示:

"2015/02/18 01:05:46.004   13.737306807  100.526088432   -22.2937   2   5"

我很難將時間戳記放入數組中。 時間值用於比較來自不同文件的具有相同時間戳的數據,解析特定時間間隔的數據以及作圖。

這就是我現在所擁有的……除了時間信息:

dt=np.dtype([('lat', float), ('lon', float), ('height', float), ('Q', int), ('ns', int)]
a=np.loadtxt('tmp.pos', dt)

有什么建議如何擴展dt以包括日期和時間列? 還是有比使用numpy的 loadtext更好的方法?

可以在以下位置找到該文件的示例: https : //www.dropbox.com/s/j69l8oeqdm73q8y/tmp.pos

編輯1

事實證明, numpy.loadtxt使用一個稱為converters的參數,可以完成此工作:

a = np.loadtxt(fname='tmp.pos', converters={0: strpdate2num('%Y/%m/%d'), 1: strpdate2num('%H:%M:%S.%f')})

這意味着a的前兩列是用浮點數表示的“日期”和“時間”。 要獲取時間字符串,我可以執行以下操作(盡管可能有些笨拙):

In [441]: [datetime.strptime(num2date(a[i,0]).strftime('%Y-%m-%d')+num2date(a[i,1]).strftime('%H:%M:%S.%f'), '%Y-%m-%d%H:%M:%S.%f') for i in range(len(a[:,0]))]

這使:

Out[441]: [datetime.datetime(2015, 2, 18, 1, 5, 46)]

但是,秒的小數部分不會保留。 我做錯了什么?

如果這是來自文本文件,則將其解析為文本可能會更簡單,除非您希望它們全部以numpy數組結尾。 例如:

>>> my_line = "2015/02/18 01:05:46.004   13.737306807  100.526088432   -22.2937   2   5"
>>> datestamp, timestamp, val1, val2, val3, val4, val5 = [v.strip() for v in my_line.split()]
>>> datestamp
'2015/02/18'
>>> timestamp
'01:05:46.004'

因此,如果要遍歷這些行的文件並為每個ine獲取本地日期時間對象:

from datetime import datetime
with open('path_to_file', 'r') as my_file:
    for line in my_file:
        d_stamp, t_stamp, val1, val2, val3, val4, val5 = [v.strip() for v in my_line.split()]
        dt_obj = datetime.strptime(' '.join([d_stamp, t_stamp]), '%Y/%m/%d %H:%M:%S.%f')

最好將時間字符串轉換為timeStamp並將值作為整數格式傳遞。 整數也會加快您的比較。

import time
dt, ts = "2015/02/18 01:05:46.004".split()
year,mon,day = [int(d) for d in dt.split('/')]
hrs,mins,secs = [int(float(d)) for d in ts.split(':')]
timeStamp = time.mktime((year,mon,day,hrs,mins,secs,0,0,time.localtime()[8]))

熊貓應該擅長於這種事情。 我不是專家,並遇到了一些麻煩與parse_date功能read_csv但以下似乎工作相當不錯,速度快:

import pandas as pd

names = ('date', 'time', 'lat', 'lon', 'height', 'Q', 'ns')
format = '%Y/%m/%d%H:%M:%S.%f'
df = pd.read_csv('tmp.pos', delim_whitespace=True, names=names)
df['datetime'] = pd.to_datetime(df['date'] + df['time'], format=format)

如果要基於時間戳選擇數據,可以將其設置為數據框索引

df.index = pd.to_datetime(df['date'] + df['time'], format=format)
print df['2015-02-18 2:30:00':'2015-02-18 2:30:10']

您也可以將time列設置為索引,但是似乎不支持僅使用時間直接切片:

format = '%H:%M:%S.%f'
df.index = pd.to_datetime(df['time'], format=format)
print df['2:30:00':'2:30:10']  # prints empty DataFrame

但是您可以使用以下命令

print df.between_time('2:30:00','2:30:10')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM