太长的数据帧应用行功能

时间:2014-03-28 00:13:39

标签: python pandas

读取列中包含时间值的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

2 个答案:

答案 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,这应该是直截了当的。