有效地分割一列numpy数组

时间:2014-10-28 04:23:51

标签: python numpy

我有一个包含5列的csv文件,其中第二列是格式为10/22/2001 14:00的时间。我想创建另一个文件,将此时间数据拆分为单独的列。为了拆分列,我在python中使用了下面的代码

from numpy import loadtxt
import numpy as np
from time import strptime

filename = 'data/file.csv'
data = loadtxt(filename, delimiter=',', dtype=str, skiprows=1)
newdata = np.zeros((data.shape[0],7))
newdata[:,0] = data[:,0]

for i in range(len(data[:,1])):
    tm =  strptime(data[i,1], "%m/%d/%Y %H:%M")
    newdata[i,1] = tm.tm_year
    newdata[i,2] = tm.tm_wday
    newdata[i,3] = tm.tm_hour

newdata[:,4:] =  data[:,2:]

使用numpy方法或python的其他模块有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

可以使用以下三行缩短newdata的生成:

  1. 将日期时间字符串转换为datetime对象:

    datetimes = [datetime.strptime(d, "%m/%d/%Y %H:%M") for d in data[:, 1]]
    

    我假设您使用from datetime import datetime

  2. 收集每个日期时间对象的年份,工作日和小时。

    yearWeekdayHour = [[dt.year, dt.weekday(), dt.hour] for dt in datetimes]
    
  3. 将所有部分水平堆叠在一起:原始data的第一列,日期和时间信息以及data的最后一列。

    newdata = np.hstack((data[:, 0, None], yearWeekdayHour, data[:, 2:]))
    

    请注意,第一列的索引附加了None以获取2D数组,这是水平堆叠所必需的。


  4. 我不太确定这是否是更好的解决方案。您的可读性可能更高,特别是对那些不完全熟悉所有Python列表推导的人。但它可能是另一种值得阅读和玩弄的选择。它可以是一个非常强大的工具。