Skip to main content
 首页 » 编程设计

python之使用 pandas 将日期、时间和纳秒解析为日期时间对象

2025年05月04日14小虾米

我有一个时间戳很奇怪的 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]