读取列中包含时间值的csv文件,并尽可能高效地获取具有1列值和日期时间索引的数据帧。我做了一个read_csv,然后是一个堆栈和以下函数,但它耗费了更多的时间和内存。
有人有更好的方法吗?
df.apply(lambda row: row['DATE'] + relativedelta( hours = int(row['level_2'][2:])), axis=1)
DATE H01 H02 H03 H04 ...
2014/01/01 1.2 2.4 3.3 4.1
2014/01/02 4.3 2.6 3.2 4.1
得到:
DATE
2014-01-01 00:00:00 1.2
2014-01-01 01:00:00 2.4
2014-01-01 02:00:00 3.3
2014-01-01 03:00:00 4.1
答案 0 :(得分:1)
如果你有一个每小时的列(即24)并且每个日期都存在,那么你最好在numpy中进行重塑(它会更快),并且只需通过{{生成DatetimeIndex 1}}。
假设日期是索引(并且它是DatetimeIndex),其他24列是小时:
date_range
否则,您可以使用itertools产品创建新索引....我会先创建列小时:
vals = df.values.reshape(-1)
new_index = pd.date_range(start=df.index[0], periods=24*len(df), freq='H')
pd.Series(vals, new_index)
注意:同样重要的是DATE是这里的DatetimeIndex。
df.columns = np.arange(0, len(df.columns)) * pd.offsets.Hour(1)
In [11]: df
Out[11]:
<0 * Hours> <Hour> <2 * Hours> <3 * Hours>
DATE
2014-01-01 1.2 2.4 3.3 4.1
2014-01-02 4.3 2.6 3.2 4.1
答案 1 :(得分:0)
您正在寻找的命令是stack
。文档中的更多信息:http://pandas.pydata.org/pandas-docs/stable/reshaping.html#reshaping-by-stacking-and-unstacking
基本上,您正在考虑使用堆栈然后将Hxx
转换为xx:00:00
,这应该是直截了当的。