<p>也许您也可以从<code>melt</code>开始,但除非出于某种原因需要使用<code>melt</code>,否则您可以通过以下方式获得它:</p>
<ol>
<li>如果还没有,则将<code>'date'</code>设为<code>datetime</code>列。你知道吗</li>
<li>使用<code>groupby</code>和<code>apply</code>可以使用<a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.date_range.html" rel="nofollow noreferrer">pandas date_range</a>生成所有时间间隔的时间戳,并使用<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.repeat.html" rel="nofollow noreferrer">numpy repeat</a>生成每小时值。你知道吗</li>
<li>最后重置索引。你知道吗</li>
</ol>
<p>翻译成代码是:</p>
<pre><code>df['date'] = pd.to_datetime(df['date'])
ddf = df.groupby('date').apply(lambda row : pd.DataFrame(
{'timestamp' : pd.date_range(row['date'].iloc[0], periods=4*len(df.columns[1:]), freq='15T'),
'value' : np.repeat(np.array([row[col].iloc[0] for col in df.columns[1:]]), 4)}))
ddf.reset_index(inplace=True, drop=True)
</code></pre>
<p>使用起始数据帧,<code>ddf</code>是:</p>
<pre><code> timestamp value
0 2019-01-01 00:00:00 0.1
1 2019-01-01 00:15:00 0.1
2 2019-01-01 00:30:00 0.1
3 2019-01-01 00:45:00 0.1
4 2019-01-01 01:00:00 0.2
5 2019-01-01 01:15:00 0.2
6 2019-01-01 01:30:00 0.2
7 2019-01-01 01:45:00 0.2
8 2019-01-02 00:00:00 0.5
9 2019-01-02 00:15:00 0.5
10 2019-01-02 00:30:00 0.5
11 2019-01-02 00:45:00 0.5
12 2019-01-02 01:00:00 0.3
13 2019-01-02 01:15:00 0.3
14 2019-01-02 01:30:00 0.3
15 2019-01-02 01:45:00 0.3
16 2019-01-03 00:00:00 0.2
17 2019-01-03 00:15:00 0.2
18 2019-01-03 00:30:00 0.2
19 2019-01-03 00:45:00 0.2
20 2019-01-03 01:00:00 0.4
21 2019-01-03 01:15:00 0.4
22 2019-01-03 01:30:00 0.4
23 2019-01-03 01:45:00 0.4
</code></pre>
<p>此代码将自动选择在<code>'date'</code>之后有多少列,假设它们都是<code>'hour'</code>列。如果数据帧中混合了其他列,则应将它们从<code>df.columns[1:]</code>中筛选出来。你知道吗</p>