如何将“pandas.DataFrame”与小时列融为一体,并以 15 分钟为间隔进行划分

我有这样的DataFrame事情:


data = [['2019-01-01', .1, .2],

        ['2019-01-02', .5, .3],

        ['2019-01-03', .2, .4]]

df = pd.DataFrame(data, columns=['date', 'hour01', 'hour02'])

         date  hour01  hour02

0  2019-01-01     0.1     0.2

1  2019-01-02     0.5     0.3

2  2019-01-03     0.2     0.4

如何融化它以便我得到适当的 15 分钟间隔?像这样:


    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

...

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

编辑

df.melt(id_vars=['timestamp'], value_vars=['hour_{}'.format(str(x).zfill(2)) for x in range(1, 24)])

给了我这个:


27    2017-01-28  hour_01  34.90

28    2017-01-29  hour_01  36.04

29    2017-01-30  hour_01  36.51

          ...      ...    ...

16760 2018-12-02  hour_23  51.50

16761 2018-12-03  hour_23  54.00

16762 2018-12-04  hour_23  53.87

然后去哪儿?


RISEBY
浏览 138回答 2
2回答

慕的地6264312

也许您也可以从头开始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  value0  2019-01-01 00:00:00    0.11  2019-01-01 00:15:00    0.12  2019-01-01 00:30:00    0.13  2019-01-01 00:45:00    0.14  2019-01-01 01:00:00    0.25  2019-01-01 01:15:00    0.26  2019-01-01 01:30:00    0.27  2019-01-01 01:45:00    0.28  2019-01-02 00:00:00    0.59  2019-01-02 00:15:00    0.510 2019-01-02 00:30:00    0.511 2019-01-02 00:45:00    0.512 2019-01-02 01:00:00    0.313 2019-01-02 01:15:00    0.314 2019-01-02 01:30:00    0.315 2019-01-02 01:45:00    0.316 2019-01-03 00:00:00    0.217 2019-01-03 00:15:00    0.218 2019-01-03 00:30:00    0.219 2019-01-03 00:45:00    0.220 2019-01-03 01:00:00    0.421 2019-01-03 01:15:00    0.422 2019-01-03 01:30:00    0.423 2019-01-03 01:45:00    0.4'date'假设它们都是列,此代码将自动选择您拥有的'hour'列数。如果您在数据框中混合了其他列,则应从df.columns[1:].

喵喔喔

基于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  value0   2019-01-01 00:00:00    0.11   2019-01-01 00:15:00    0.12   2019-01-01 00:30:00    0.13   2019-01-01 00:45:00    0.14   2019-01-01 01:00:00    0.2..                  ...    ...192 2019-01-03 00:00:00    0.2193 2019-01-03 00:15:00    0.2194 2019-01-03 00:30:00    0.2195 2019-01-03 00:45:00    0.2196 2019-01-03 01:00:00    0.4
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python