【发布时间】:2020-12-20 10:33:37
【问题描述】:
我有两个不同的包含时间序列数据的 CSV。一张桌子是连续的,从 01.01.2017 的 00:00 开始。从那里开始,每一行代表一小时(1. 表)。数据看起来像这样:
- 表格又名 df1:
Date, Volume
2017-02-03 12-PM, 9787.51
2017-02-03 01-PM, 9792.01
2017-02-03 02-PM, 9803.94
2017-02-03 03-PM, 9573.99
另一个表包含发生的事件,并由 UNIX 日期时间以秒为单位进行序列化。我能够将其转换为日期时间并使用以下代码按小时分组:
df['datetime'] = pd.to_datetime(df['created_utc'], unit='s')
df['datetime'] = pd.to_datetime(df['datetime'], format="%Y-%m-%d %I-%p")
df['date_by_hour'] = df['datetime'].apply(lambda x: x.strftime('%Y-%m-%d %H:00'))
这导致了以下数据:
- 表又名 df2:
created_utc, score, compound, datetime, date_by_hour
1486120391, 156, 0.125, 2017-02-03 12:13:11, 2017-02-03 12:00:00
1486125540, 1863, 0.475, 2017-02-03 13:39:00, 2017-02-03 13:00:00
1486126013, 863, 0.889, 2017-02-03 13:46:53, 2017-02-03 13:00:00
1486130203, 23, 0.295, 2017-02-03 14:56:43, 2017-02-03 14:00:00
现在我需要将事件 (2.table) 映射到 1. 表的时间序列。如果在一小时内发生了多个事件,我需要将分数相加并计算化合物的平均平均值。最后我想要一个这样的数据框:
- 最终数据帧
Date, Volume, score, compound,
2017-02-03 12-PM, 9787.51, 156, 0.125,
2017-02-03 01-PM, 9792.01, 2726, 0.682,
2017-02-03 02-PM, 9803.94, 23, 0.295,
2017-02-03 03-PM, 9573.99, 0, 0,
我知道我下面的代码不起作用并且是错误的,但我想展示我在想如何实现这一点。我想我可以遍历我的事件表 df2 的每一行并比较日期时间是否匹配。如果是这样,我会计算分数和复合。问题是我知道不应该循环遍历数据帧,而且我不知道如何同时循环遍历另一个数据帧并根据前面的行执行正确的计算...
for index, row in df2.iterrows():
memory_score = 0
memory_compound = 0
if df1['Date'] == df2['date_by_hour']:
df1['score'] = row['score'] + memory_score
df1['compound'] = (row['compound'] + memory_compound) / 2
如何获得我的最终数据框?一定有一些 pandas 魔法可以用来完成这项工作并将时间序列数据映射到正确的时间。
提前致谢并致以最诚挚的问候
编辑:一小时内可以有未定义数量的事件。我只是为这个简单的示例选择了 2,但在某些情况下它可能是 5000 或其他值或 0。
【问题讨论】: