我有一个格式化为这样的数据文件:
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 转换为微秒,以便日期时间模块可以读取数据,但无法读取。 数据读取正常,但日期返回为"nan"。 我还尝试转换为秒并四舍五入为整数值,并且分钟相同。 我想也许我需要读取数据,然后将毫秒更改为 hour:min:sec 以使用日期时间,但我想先在这里检查是否有更好的方法,或者我是否正确使用日期时间。 感谢您的帮助!
这是我的代码:
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"工作 - 但如果可以,请告诉我!
使用 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
是文件中的数据。
使用普通的老式 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 解决方案一样简洁,也许同样可读,如果我的代码更"pythonic",也会是一样的。
无论如何,希望这有帮助!