我有一个时间戳很奇怪的 ASCII 文件:
DATAH DATE TIME SECONDS NANOSECONDS D
DATA 2012-06-04 23:49:15 1338853755 700000000 0.00855577
DATA 2012-06-04 23:49:15 1338853755 800000000 0.00805482
DATA 2012-06-04 23:49:15 1338853755 900000000 -0.00537284
DATA 2012-06-04 23:49:16 1338853756 0 -0.0239447
时间戳基本上分为 4 列 - DATE、TIME、SECONDS 和 NANOSECONDS。 我想将文件作为 pandas DataFrame 读取,其中 DATE、TIME 和 NANOSECONDS 作为 datetime 对象,用作索引:
import datetime as dt
import pandas as pd
parse = lambda x: dt.datetime.strptime(x, '%Y-%m-%d %H:%M:%S %f')
df = pd.read_csv('data.txt', sep='\t', parse_dates=[['DATE', 'TIME', 'NANOSECONDS']], index_col=0, date_parser=parse)
但这失败了,因为纳秒值有 9 位而不是 %f 格式要求的 6 位。如果我手动从 NANOSECONDS 列的值中删除 3 个额外的零,则上面的代码有效。 你能告诉我如何使用 DATE、TIME 和 NANOSECONDS 列作为索引将示例文件作为 pandas DataFrame 对象读入吗?
[更新] 按照 behzad.nouri 的建议使用 %f000如果 NANOSECONDS 列不包含 0 值,则有效。所以,这显然是现在导致问题的原因。
请您参考如下方法:
这比使用 read_csv 日期解析器进行此转换要快得多。
In [6]: data = """DATAH DATE TIME SECONDS NANOSECONDS D
...: DATA 2012-06-04 23:49:15 1338853755 700000000 0.00855577
...: DATA 2012-06-04 23:49:15 1338853755 800000000 0.00805482
...: DATA 2012-06-04 23:49:15 1338853755 900000000 -0.00537284
...: DATA 2012-06-04 23:49:16 1338853756 0 -0.0239447"""
In [7]: df = read_csv(StringIO(data),sep='\s+')
In [8]: df
Out[8]:
DATAH DATE TIME SECONDS NANOSECONDS D
0 DATA 2012-06-04 23:49:15 1338853755 700000000 0.008556
1 DATA 2012-06-04 23:49:15 1338853755 800000000 0.008055
2 DATA 2012-06-04 23:49:15 1338853755 900000000 -0.005373
3 DATA 2012-06-04 23:49:16 1338853756 0 -0.023945
[4 rows x 6 columns]
In [9]: df.dtypes
Out[9]:
DATAH object
DATE object
TIME object
SECONDS int64
NANOSECONDS int64
D float64
dtype: object
In [13]: pd.to_datetime(df['SECONDS']+df['NANOSECONDS'].astype(float)/1e9, unit='s')
Out[13]:
0 2012-06-04 23:49:15.700000
1 2012-06-04 23:49:15.800000
2 2012-06-04 23:49:15.900000
3 2012-06-04 23:49:16
dtype: datetime64[ns]
