2017-06-20 55 views
1

我正在尝试用熊猫来重塑表格。日期列,每年有365行。每小时24列,每个值对应当天的小时24列。我正在尝试用day + hour(每天24行)创建一个列,并使用相应的值创建列。这里是目前的头():熊猫表重新塑造|用小时创建日期时间列

Date   | hour1  | value1 | hour2 | value2 ... hour24 |  value 24 

2016-01-01 | 1 |  4100 | 2 | 3500 | 24 |  5200 

Here is the desired format: 

Date     |  value 

2016-01-01 01 | 4100 

2016-01-01 02 | 3500 

.... 

2016-01-01 24 | 5200 

我已经试过融化和pivoting,但无法获得排序的日期+小时列。

回答

0

您需要lreshape通过dict,然后通过drop并在必要时sort_values通过Date列添加hour小号转化为to_timedelta和最后删除列A

print (df) 
     Date hour1 value1 hour2 value2 hour24 value24 
0 2016-01-01  1 4100  2 3500  24  5200 
1 2016-01-02  1 3000  2 3700  24  7200 

a = [col for col in df.columns if col.startswith('hour')] 
b = [col for col in df.columns if col.startswith('value')] 

df = pd.lreshape(df, {'A' : a, 'B' : b}) 
df['Date'] = pd.to_datetime(df['Date']) + pd.to_timedelta(df['A'], unit='h') 
df = df.drop('A', axis=1).sort_values('Date') 
print (df) 
       Date  B 
0 2016-01-01 01:00:00 4100 
2 2016-01-01 02:00:00 3500 
4 2016-01-02 00:00:00 5200 
1 2016-01-02 01:00:00 3000 
3 2016-01-02 02:00:00 3700 
5 2016-01-03 00:00:00 7200 

另一个解决方案是通过str.extract创建MultiIndex.from_arraysDataFrame.stack重塑:

df = df.set_index('Date') 
mux = df.columns.to_series().str.extract('([A-Za-z]+)(\d+)', expand=True) 
df.columns = pd.MultiIndex.from_arrays([mux[0], mux[1]], names=('a','b')) 
df = df.stack(1).reset_index() 
df['Date'] = pd.to_datetime(df['Date']) + pd.to_timedelta(df['hour'], unit='h') 
df = df.drop(['b', 'hour'], axis=1).rename_axis(None, axis=1) 
print (df) 
       Date value 
0 2016-01-01 01:00:00 4100 
1 2016-01-01 02:00:00 3500 
2 2016-01-02 00:00:00 5200 
3 2016-01-02 01:00:00 3000 
4 2016-01-02 02:00:00 3700 
5 2016-01-03 00:00:00 7200