[英]Fastest way to create time series dataframe
我想获取包含时间间隔和时间重复的数据,并且基本上使用任何给定时间的第一次出现并向前填充来创建时间序列。 考虑以下示例。
假设这是我们感兴趣的时间范围:
时间 |
---|
1:00 |
1:01 |
1:02 |
1:03 |
1:04 |
1:05 |
这是数据,dataframe X,我们想放入我们的时间序列:
出现 | 价值 |
---|---|
1:00 | “R” |
1:03 | “G” |
1:03 | “大号” |
1:03 | “P” |
1:03 | “T” |
1:05 | “S” |
这是最终的 Dataframe:
出现 | 价值 |
---|---|
1:00 | “R” |
1:01 | “R” |
1:02 | “R” |
1:03 | “G” |
1:04 | “G” |
1:05 | “S” |
如您所见,在最终 Dataframe 中,1:00 的值为“R”,因为这是 dataframe X 中第一次出现 1:00 的值。1:01 和 1:02 也具有值“R”因为在 dataframe X 中没有这些时间实例的数据,因此将使用最后一个有效值(即 1:00 的值)。 1:03 的值为“G”,因为与 1:00 的情况类似,“G”是我们在 dataframe X 中拥有的 1:03 的第一个值。因为在 dataframe X 中没有 1:04 的值, 1:04 在我们生成的 dataframe 中获取最后一个有效值“G”。 最后,1:05 在我们生成的 dataframe 中将具有值“S”,因为这是 dataframe X 中第一次出现 1:05 的值。
最快的方法是什么?
merge_asof
请参阅下面的解决方案以查看最终解决方案。
首先,我们需要将这些列更改为pd.Timedelta
:
df1['Time'] = pd.to_timedelta(df1['Time'] + ':00')
df2['Occurance'] = pd.to_timedelta(df2['Occurance'] + ':00')
然后我们可以merge_asof
pd.merge_asof(df1, df2, left_on='Time', right_on='Occurance')
Time Occurance Value
0 0 days 01:00:00 0 days 01:00:00 R
1 0 days 01:01:00 0 days 01:00:00 R
2 0 days 01:02:00 0 days 01:00:00 R
3 0 days 01:03:00 0 days 01:03:00 T
4 0 days 01:04:00 0 days 01:03:00 T
5 0 days 01:05:00 0 days 01:05:00 S
这有几个问题:
T
s 而不是G
s 好的摆脱列,我们只是重命名其中一列而不是使用left_on
/ right_on
pd.merge_asof(df1.set_axis(['Occurance'], axis=1), df2)
Occurance Value
0 0 days 01:00:00 R
1 0 days 01:01:00 R
2 0 days 01:02:00 R
3 0 days 01:03:00 T
4 0 days 01:04:00 T
5 0 days 01:05:00 S
但是我们仍然有T
s 而不是G
s,那是因为看df2
Occurance Value
0 0 days 01:00:00 R
1 0 days 01:03:00 G # same Occurance
2 0 days 01:03:00 L # same Occurance
3 0 days 01:03:00 P # same Occurance
4 0 days 01:03:00 T # same Occurance
5 0 days 01:05:00 S
显然,Pandas 拿了最后一个,而 OP 想要第一个。 所以让我们用drop_duplicates
再试一次
pd.merge_asof(df1.set_axis(['Occurance'], axis=1),
df2.drop_duplicates('Occurance'))
Occurance Value
0 0 days 01:00:00 R
1 0 days 01:01:00 R
2 0 days 01:02:00 R
3 0 days 01:03:00 G
4 0 days 01:04:00 G
5 0 days 01:05:00 S
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.