Pandas 用“a”中的数据转换数据;“列表列”;转换为长格式的时间序列。使用三列:[数据列表]+;[时间戳]+;[持续时间]
其目的是将具有列表列作为数据列(因此每行仅具有一个时间戳和持续时间)的数据帧转换为具有每个单个项的datetimeindex的长格式时间序列 结果,数据不再具有每行的序列/列表,而只有一个值列Pandas 用“a”中的数据转换数据;“列表列”;转换为长格式的时间序列。使用三列:[数据列表]+;[时间戳]+;[持续时间],pandas,dataframe,timestamp,nested-lists,datetimeindex,Pandas,Dataframe,Timestamp,Nested Lists,Datetimeindex,其目的是将具有列表列作为数据列(因此每行仅具有一个时间戳和持续时间)的数据帧转换为具有每个单个项的datetimeindex的长格式时间序列 结果,数据不再具有每行的序列/列表,而只有一个值列 df_test = pd.DataFrame({'timestamp': [1462352000000000000, 1462352100000000000, 1462352200000000000, 1462352300000000000], 'list': [[1,2,
df_test = pd.DataFrame({'timestamp': [1462352000000000000, 1462352100000000000, 1462352200000000000, 1462352300000000000],
'list': [[1,2,1,9], [2,2,3,0], [1,3,3,0], [1,1,3,9]],
'duration_sec': [3.0, 3.0, 3.0, 3.0]})
tdi = pd.DatetimeIndex(df_test.timestamp)
df_test.set_index(tdi, inplace=True)
df_test.drop(columns='timestamp', inplace=True)
df_test.index.name = 'datetimeindex'
输出:
目的是:
value
datetimeindex
2016-05-04 08:53:20 1
2016-05-04 08:53:21 2
2016-05-04 08:53:22 1
2016-05-04 08:53:23 9
2016-05-04 08:55:00 2
2016-05-04 08:55:01 2
2016-05-04 08:55:02 3
2016-05-04 08:55:03 0
2016-05-04 08:56:40 1
2016-05-04 08:56:41 3
2016-05-04 08:56:42 3
2016-05-04 08:56:43 0
2016-05-04 08:58:20 1
2016-05-04 08:58:21 1
2016-05-04 08:58:22 3
2016-05-04 08:58:23 9
请注意,这不仅仅意味着每个项目需要1秒,这只是为了简化示例。相反,它是一个序列中的大约4个项目,其具有例如3.0秒的给定持续时间(也可能因行而异),并且其中每个序列的第一个项目总是在“时间0”处开始,这意味着每个项目的秒数应该像[3.0秒/(4-1)个项目]=1秒那样计算
####
背景:
该示例显示了到Datetimeindex的转换,因为这使它适合季节分解(),请参阅
第一次搜索成功
在这里,生成的df如下所示:
df_test2 = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'], index_col='date')
输出:
然后很容易应用seational_decompose()-->加法分解:
result_add = seasonal_decompose(df_test2['value'], model='additive', extrapolate_trend='freq')
绘图:
现在,上述df_测试也需要相同的方法。首先使用计数器,然后将计数器按和添加到df。索引:
df_test = df_test.explode('nestedList')
df_test.index += pd.to_timedelta(df_test.groupby(level=0).cumcount(), unit='s')
print (df_test)
nestedList duration_sec
2016-05-04 08:53:20 1 3.0
2016-05-04 08:53:21 2 3.0
2016-05-04 08:53:22 1 3.0
2016-05-04 08:53:23 9 3.0
2016-05-04 08:55:00 2 3.0
2016-05-04 08:55:01 2 3.0
2016-05-04 08:55:02 3 3.0
2016-05-04 08:55:03 0 3.0
2016-05-04 08:56:40 1 3.0
2016-05-04 08:56:41 3 3.0
2016-05-04 08:56:42 3 3.0
2016-05-04 08:56:43 0 3.0
2016-05-04 08:58:20 1 3.0
2016-05-04 08:58:21 1 3.0
2016-05-04 08:58:22 3 3.0
2016-05-04 08:58:23 9 3.0
编辑:
EDIT2由asker编写:
通过生成的df,现在可以简单地应用decompose(),这是最终目标:
result_add = seasonal_decompose(x=df_test['nestedList'], model='additive', extrapolate_trend='freq', period=int(len(df_test)/2))
plt.rcParams.update({'figure.figsize': (5,5)})
result_add.plot().suptitle('Additive Decompose', fontsize=22)
plt.show()
首先使用计数器,然后将计数器按和添加到测向索引中
:
df_test = df_test.explode('nestedList')
df_test.index += pd.to_timedelta(df_test.groupby(level=0).cumcount(), unit='s')
print (df_test)
nestedList duration_sec
2016-05-04 08:53:20 1 3.0
2016-05-04 08:53:21 2 3.0
2016-05-04 08:53:22 1 3.0
2016-05-04 08:53:23 9 3.0
2016-05-04 08:55:00 2 3.0
2016-05-04 08:55:01 2 3.0
2016-05-04 08:55:02 3 3.0
2016-05-04 08:55:03 0 3.0
2016-05-04 08:56:40 1 3.0
2016-05-04 08:56:41 3 3.0
2016-05-04 08:56:42 3 3.0
2016-05-04 08:56:43 0 3.0
2016-05-04 08:58:20 1 3.0
2016-05-04 08:58:21 1 3.0
2016-05-04 08:58:22 3 3.0
2016-05-04 08:58:23 9 3.0
编辑:
EDIT2由asker编写:
通过生成的df,现在可以简单地应用decompose(),这是最终目标:
result_add = seasonal_decompose(x=df_test['nestedList'], model='additive', extrapolate_trend='freq', period=int(len(df_test)/2))
plt.rcParams.update({'figure.figsize': (5,5)})
result_add.plot().suptitle('Additive Decompose', fontsize=22)
plt.show()
duration_sec列在这个问题上有什么意义吗?@EddyG之所以需要它,是因为您需要找出“开始”之后的下一个时间戳,而您只知道每行的下一个时间戳。我没有关于每个序列中项目之间时间的任何其他信息。因此,我认为下一个时间戳只能通过“+duration/len(sequence)”来计算。duration\u sec列在这个问题中有什么意义吗?@EddyG它是必需的,因为您需要找出在“start”之后的下一个时间戳,您只知道每行一次。我没有关于每个序列中项目之间时间的任何其他信息。因此,我认为下一个时间戳只能通过“+duration/len(sequence)”来计算。至于@EddyG的评论,这只是目前的秒数。如果我在序列中有50个项目,持续时间为30秒,这将不再有效。我必须加上30/50秒,而不是一整秒。我现在接受这一点太早了,我的问题不清楚。虽然现在的答案在问题发布的几分钟内就已经很精彩了。@Lorenz-有一件事我不清楚,子列表中有4个值,但是有
duration\u sec
列除以3
?所以它的意思是默认情况下,长度减去1
?因此,解决方案是df_test=df_test.explode('nestedList')
size=df_test.groupby(level=0)['nestedList'].transform('size').sub(1).div(df_test['duration_sec'))
df_test.index+=pd.to_timedelta(df_test.groupby(level=0.cumcount()*size,unit='s'))
我将更改此问题,这样持续时间将不再计算角色,而是按每个项目设置一个通常的持续时间,无论其顺序如何。给我几分钟。好了,完成了,现在问题中包括了全局持续时间变量。请使用groupby(level=0)。cumcount()*size
更改为groupby(level=0)。cumcount()*duration
在您的答案中,在前面引入duration=1
,并删除输出中现在不需要的duration\u sec列。ThxI将检查。我会让你知道,如果这解决了它,它可能会有助于获得你现在提供的每个项目的持续时间。看起来很有希望,给我一些时间。至于@EddyG的评论,现在只剩几秒钟了。如果我在序列中有50个项目,持续时间为30秒,这将不再有效。我必须加上30/50秒,而不是一整秒。我现在接受这一点太早了,我的问题不清楚。虽然现在的答案在问题发布的几分钟内就已经很精彩了。@Lorenz-有一件事我不清楚,子列表中有4个值,但是有duration\u sec
列除以3
?所以它的意思是默认情况下,长度减去1
?因此,解决方案是df_test=df_test.explode('nestedList')
size=df_test.groupby(level=0)['nestedList'].transform('size').sub(1).div(df_test['duration_sec'))
df_test.index+=pd.to_timedelta(df_test.groupby(level=0.cumcount()*size,unit='s'))
我将更改此问题,这样持续时间将不再计算角色,而是按每个项目设置一个通常的持续时间,无论其顺序如何。给我几分钟。好了,完成了,现在问题中包括了全局持续时间变量。请使用groupby(level=0)。cumcount()*size
更改为groupby(level=0)。cumcount()*duration
在您的答案中,在前面引入duration=1
,并删除输出中现在不需要的duration\u sec列。ThxI将检查。我会让你知道,如果这解决了它,它可能会有助于获得你现在提供的每个项目的持续时间。看起来很有希望,给我点时间。
df_test = df_test.explode('nestedList')
sizes = df_test.groupby(level=0)['nestedList'].transform('size').sub(1)
duration = df_test['duration_sec'].div(sizes)
df_test.index += pd.to_timedelta(df_test.groupby(level=0).cumcount() * duration, unit='s')
result_add = seasonal_decompose(x=df_test['nestedList'], model='additive', extrapolate_trend='freq', period=int(len(df_test)/2))
plt.rcParams.update({'figure.figsize': (5,5)})
result_add.plot().suptitle('Additive Decompose', fontsize=22)
plt.show()