【问题标题】:Pandas Transforming Time Series 15 minutes DataPandas 转换时间序列 15 分钟数据
【发布时间】:2021-01-06 14:05:52
【问题描述】:

我有一个时间序列数据,其中包含每 15 分钟时间段获取的价格值。我想转换每个时间块变成一列的数据,我们得到一个特定日期的一行。 例如,包含 2 列 - ['Date-Time', 'Price'] 的数据框会生成 1+96 列 - ['Date'] 和每个时间块的 96 列的数据框。

这是我为将小时数转换为列而编写的代码 - 给出了 24 列小时数。如何将 15 分钟明智地转换为 96 列-

def transform_to_hour_cols(series):
    df = pd.DataFrame()

    start = series.index.min()
    end = series.index.max()
    
    df['year'] = series.index.year
    df['month'] = series.index.month
    df['day'] = series.index.day
    df['hours'] = series.index.hour
    df['loads'] = series.values
  
    
    df = df.set_index(['year', 'month', 'day', 'hours'], append=True).unstack()
    df = df.groupby(['year', 'month', 'day']).sum()
    
    df.reset_index(inplace=True)
    df.drop(['year', 'month', 'day'], axis=1, inplace=True)
    
    date_list = pd.date_range(start=start, end=end, freq='D').strftime('%Y-%m-%d')
    
    df.index = pd.DatetimeIndex(date_list, name='date')
    
    return df

price = transform_to_hour_cols(df['Price'])
price.head()

这是示例数据框-

【问题讨论】:

  • 您可以使用Series.dt.minute 来获得精确的分布。由于您的数据只有 15 分钟的窗口,它会自动调整。

标签: python-3.x pandas time-series python-datetime


【解决方案1】:
  1. 您可以使用dt.date 和dt.time 创建date 和time 列。
  2. 然后,将time 发送到列。为此,首先,您必须将date 和time 放在带有.set_index() 的索引上。然后,使用.unstack(1) 将time 移动到列。 unstack() 中的 1 表示您正在传递刚刚创建的多索引中的第二个索引列。如果您传递了0,那么您将向列发送date。
  3. 最后用.reset_index(level=0)清理列多索引

df = pd.DataFrame({'date' : ['2020-04-01 00:00:00', '2020-04-01 00:15:00',
                             '2020-04-01 00:30:00', '2020-04-01 00:45:00', '2020-04-01 01:00:00'],
                   'mcp' : [2399.21, 2499.07, 2448.89, 2399.80, 2199.89]})
df['date'] = pd.to_datetime(df['date'])
df['time'] = df['date'].dt.time
df['date'] = df['date'].dt.date
df = df.set_index(['date', 'time']).unstack(1).reset_index(level=0)
df
Out[1]: 
           date      mcp                                    
time            00:00:00 00:15:00 00:30:00 00:45:00 01:00:00
0    2020-04-01  2399.21  2499.07  2448.89   2399.8  2199.89

根据您提供的示例数据,我假设您已成功按日期按行分组为 15 分钟间隔,因此这只会帮助您将 15 分钟间隔分组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-08
    • 2013-12-26
    • 2017-08-26
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2019-01-13
    相关资源
    最近更新 更多