Pandas 转换时间序列 15 分钟数据
Pandas Transforming Time Series 15 minutes Data
我有一个时间序列数据,其中包含每 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()
这是示例数据框-
- 您可以使用
dt.date
和 dt.time
创建 date
和 time
列。
- 然后,将
time
发送到列。为此,首先,您必须将 date
和 time
放在带有 .set_index()
的索引上。然后,使用 .unstack(1)
将 time
移动到列。 unstack()
中的 1
表示您正在传递刚刚创建的多索引中的第二个索引列。如果您已通过 0
,那么您将向列发送 date
。
- 最后,用
.reset_index(level=0)
清理列 multi-index
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 分钟的时间间隔 row-wise,因此这只会帮助您将 15 分钟的时间间隔放入列中。
我有一个时间序列数据,其中包含每 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()
这是示例数据框-
- 您可以使用
dt.date
和dt.time
创建date
和time
列。 - 然后,将
time
发送到列。为此,首先,您必须将date
和time
放在带有.set_index()
的索引上。然后,使用.unstack(1)
将time
移动到列。unstack()
中的1
表示您正在传递刚刚创建的多索引中的第二个索引列。如果您已通过0
,那么您将向列发送date
。 - 最后,用
.reset_index(level=0)
清理列 multi-index
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 分钟的时间间隔 row-wise,因此这只会帮助您将 15 分钟的时间间隔放入列中。