2 回答

TA貢獻1817條經驗 獲得超6個贊
也許您也可以從頭開始melt
,但除非melt
由于某種原因需要使用,否則您可以通過以下方式獲得它:
如果還沒有, 請
'date'
創建一個列。datetime
使用
groupby
并且您可以使用pandas date_rangeapply
為所有時間間隔生成時間戳,并使用numpy repeat跨越每小時值。最后重新設置索引。
翻譯成代碼是:
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)
使用您的起始數據框ddf是:
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
'date'假設它們都是列,此代碼將自動選擇您擁有的'hour'列數。如果您在數據框中混合了其他列,則應從df.columns[1:].

TA貢獻1735條經驗 獲得超5個贊
基于melt和set_index 的解決方案ffill:
df = df.melt(id_vars=['date'], var_name='hour')
df['timestamp'] = pd.to_datetime(df['date']) + pd.to_timedelta(df['hour'].str[4:].astype(int) - 1, unit='h')
df = df.set_index(pd.DatetimeIndex(df['timestamp']))
df = df.drop(columns=['timestamp', 'date', 'hour'])
df = df.resample('15T').ffill()
df = df.reset_index()
結果:
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
.. ... ...
192 2019-01-03 00:00:00 0.2
193 2019-01-03 00:15:00 0.2
194 2019-01-03 00:30:00 0.2
195 2019-01-03 00:45:00 0.2
196 2019-01-03 01:00:00 0.4
添加回答
舉報