为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

RISEBY 2022-06-22 15:24:49
我有这样的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  hour020  2019-01-01     0.1     0.21  2019-01-02     0.5     0.32  2019-01-03     0.2     0.4如何融化它以便我得到适当的 15 分钟间隔?像这样:    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.2...16 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编辑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.9028    2017-01-29  hour_01  36.0429    2017-01-30  hour_01  36.51          ...      ...    ...16760 2018-12-02  hour_23  51.5016761 2018-12-03  hour_23  54.0016762 2018-12-04  hour_23  53.87然后去哪儿?
查看完整描述

2 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

也许您也可以从头开始melt,但除非melt由于某种原因需要使用,否则您可以通过以下方式获得它:

  1. 如果还没有, 请'date'创建一个列。datetime

  2. 使用groupby并且您可以使用pandas date_rangeapply为所有时间间隔生成时间戳,并使用numpy repeat跨越每小时值。

  3. 最后重新设置索引。

翻译成代码是:

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:].


查看完整回答
反对 回复 2022-06-22
?
喵喔喔

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


查看完整回答
反对 回复 2022-06-22
  • 2 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信