我有一个格式如下的数据文件:
year doy milliseconds data
2000 103 272220 1.123
2000 103 373058 1.342
2000 103 471764 0.743
2000 103 573509 1.666
2000 103 664624 1.736
2000 103 758810 1.762
2000 103 951634 1.888
2000 103 1071637 1.444
2000 103 1156676 1.001
我想用python阅读。我首先使用awk转换为微秒,以便datetime模块可以读取数据,但它无法读取。数据读取正常,但日期返回为“nan”。我也尝试过转换为秒并四舍五入到整数值,并在几分钟内完成相同的操作。我想也许我需要读取数据然后将毫秒更改为小时:min:sec以使用datetime但我想先检查这里是否有更好的方法或者我是否正确使用datetime。谢谢你的帮助!
这是我的代码:
datefunc = lambda x: mdates.date2num(datetime.datetime.strptime(x,'%Y %j %S'))
data = np.genfromtxt(sat_filenames,delimiter=(13,10),converters={0:datefunc},
names='Date, Var')
我使用空格号来说明分隔符,因为我无法让'\ t'工作 - 但如果可以,请告诉我!
答案 0 :(得分:1)
使用pandas
:
import pandas as pd
f = r"df2dt.txt"
df = pd.read_csv(f, delim_whitespace=True)
td_ms = pd.to_timedelta(df['milliseconds'], unit='ms')
td_D = pd.to_timedelta(df['doy'] - 1, unit='D')
date_str = df['year'].astype(str)
date = pd.to_datetime(date_str, format="%Y", yearfirst=True)
date_time = date + td_D + td_ms
data = df['data']
print(date_time, data)
df2dt.txt
是您在文件中的数据。
答案 1 :(得分:0)
使用普通的Python datetime
:
import datetime
dates = []
with open('datafile.txt','r') as fp:
fp.readline()
lines = fp.readlines()
for line in lines:
line = line.rstrip('\n').split()
data = float(line[3])
line = map(int, line[0:3])
line.append(data)
dates.append(line)
print '{0:<32}{1}'.format('datetime', 'data')
for dt in dates:
date = datetime.datetime(dt[0], 1, 1) + datetime.timedelta(days=dt[1], milliseconds=dt[2])
print '{0}\t{1}'.format(date, dt[3])
输出:
datetime data
2000-04-13 00:04:32.220000 1.123
2000-04-13 00:06:13.058000 1.342
2000-04-13 00:07:51.764000 0.743
2000-04-13 00:09:33.509000 1.666
2000-04-13 00:11:04.624000 1.736
2000-04-13 00:12:38.810000 1.762
2000-04-13 00:15:51.634000 1.888
2000-04-13 00:17:51.637000 1.444
2000-04-13 00:19:16.676000 1.001
标题提到微秒但问题是指毫秒,因此根据需要更改传递给timedelta的参数。此外,我不确定data
列引用的内容或如何将其包含在日期或时间中,因为问题确实包含毫秒。如果此答案需要修改以匹配您想要的输出,请在评论中注明并更新。否则,修改它以获得确切的期望输出应该相当简单。
请注意,仅使用python的本地datetime
模块的代码几乎与pandas解决方案一样简洁,也许只是可读,如果我的代码更多&#34; pythonic&#将会是相同的34。
无论如何,希望这有帮助!