我的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对象?

[更新]如果NANOSECONDS列不包含0值,则按照behzad.nouri的建议使用%f000可以使用。因此,显然这就是导致问题的原因。

最佳答案

这将比使用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]

07-24 19:13