【问题标题】:Read a custom formatted datetime with numpy使用 numpy 读取自定义格式的日期时间
【发布时间】:2016-01-18 17:25:30
【问题描述】:

我正在尝试从某些文件加载​​时间序列数据。数据有这种格式

04/02/2015 19:07:53.951,3195,1751,-44,-25

我正在使用此代码将整个文件加载为 numpy 对象。

 content = np.loadtxt(filename, dtype={'names': ('timestamp', 'tick', 'ch', 'NodeI', 'Base'),
                                      'formats': ('datetime64[us]', 'i4', 'i4', 'i4', 'i4')}, delimiter=',', skiprows=27)

但我的日期时间格式出错

ValueError: Error parsing datetime string "04/02/2015 19:07:53.951" at position 2

有一种简单的方法来定义我正在阅读的日期时间格式吗?有很多数据的文件,所以我尽量不要多次遍历文件。

【问题讨论】:

  • 我的建议:读取字符串数据类型的时间戳,然后对每个条目进行转换。

标签: python datetime numpy


【解决方案1】:

使用converters 参数将转换器函数应用于第一列的数据:

import datetime

def parsetime(v): 
    return np.datetime64(
        datetime.datetime.strptime(v, '%d/%m/%Y %H:%M:%S.%f')
    )

content = np.loadtxt(
    filename, 
    dtype={
        'names': ('timestamp', 'tick', 'ch', 'NodeI', 'Base'),
        'formats': ('datetime64[us]', 'i4', 'i4', 'i4', 'i4')
    }, 
    delimiter=',', 
    skiprows=27,
    converters={0: parsetime},
)

我假设您的数据文件使用的是D/M/Y,如果您使用的是M/D/Y,请相应地调整格式字符串。

【讨论】:

  • 我意识到以这种方式保存的数据是一个数组,但是每一行都是一个“void”类型,而不是 ndarray,所以我不能做 data [:,2] 例如获取一整列
  • 这是从第三列获取所有值的语法吗?为了得到整列,例如,第 3 列(索引 2)我会做 content['ch']... 抱歉,我是 Web 开发人员,不是数据科学家,我并没有真正使用 numpy。
  • 好点它可以以这种方式工作(另一种方式适用于 panda 解决方案),所以我将测试两者的效率
【解决方案2】:

我建议使用 pandas 库和read_csv,您可以使用parse_dates 选择列并设置infer_datetime_format 将其转换为日期时间格式:

import pandas as pd
a=pd.read_csv('nu.txt',parse_dates=[0],infer_datetime_format=True,sep=',',header=None)

a.iloc[:,0]



0   2015-04-02 19:07:53.951
1   2015-04-02 19:07:53.951
2   2015-04-02 19:07:53.951
3   2015-04-02 19:07:53.951
Name: 0, dtype: datetime64[ns]
# assumes file with four identical rows and no header

此外,如果需要,也可以轻松转换为 numpy:

b=np.array(a)
array([[Timestamp('2015-04-02 19:07:53.951000'), 3195L, 1751L, -44L, -25L],
       [Timestamp('2015-04-02 19:07:53.951000'), 3195L, 1751L, -44L, -25L],
       [Timestamp('2015-04-02 19:07:53.951000'), 3195L, 1751L, -44L, -25L],
       [Timestamp('2015-04-02 19:07:53.951000'), 3195L, 1751L, -44L, -25L]], dtype=object)

【讨论】:

  • 即使感觉很慢,它也能很好地工作。我会再做一些测试。无论如何,谢谢。
  • pd.read_csv 不创建具有ns 分辨率的 Pandas 日期时间对象吗?如果我想要跨越 9999-12-31 的日期怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多