我有一个包含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的其他模块有更好的方法吗?
答案 0 :(得分:1)
你可以使用以下三行缩短newdata
的生成:
将日期时间字符串转换为datetime对象:
datetimes = [datetime.strptime(d, "%m/%d/%Y %H:%M") for d in data[:, 1]]
我假设您使用from datetime import datetime
。
收集每个日期时间对象的年份,工作日和小时。
yearWeekdayHour = [[dt.year, dt.weekday(), dt.hour] for dt in datetimes]
将所有部分水平堆叠在一起:原始data
的第一列,日期和时间信息以及data
的最后一列。
newdata = np.hstack((data[:, 0, None], yearWeekdayHour, data[:, 2:]))
请注意,第一列的索引附加了None
以获取2D数组,这是水平堆叠所必需的。
我不太确定这是否是更好的解决方案。您的可读性可能更高,特别是对那些不完全熟悉所有Python列表推导的人。但它可能是另一种值得阅读和玩弄的选择。它可以是一个非常强大的工具。