在python中合并具有不同时间频率的系列/数据帧
Posted
技术标签:
【中文标题】在python中合并具有不同时间频率的系列/数据帧【英文标题】:merge series/dataframe with different time frequencies in python 【发布时间】:2018-06-23 12:22:24 【问题描述】:我正在尝试合并两个系列,一个以小时为单位,另一个以分钟为单位(并将索引保持在分钟级别):
Series A:
time
2017-09-01 01:00:00 0.5
2017-09-01 02:00:00 0.4
Freq: H, Name: A, dtype: float64
B 系列在几分钟内:
Series B
time
2017-09-01 00:00:00 NaN
2017-09-01 00:03:00 -0.000350
2017-09-01 00:06:00 0.000401
Name: B, dtype: float64
我想按小时合并这两个系列。所需的合并数据框将是:
time
2017-09-01 00:00:00 NaN 0.5
2017-09-01 00:03:00 -0.000350 0.5
2017-09-01 00:06:00 0.000401 0.5
2017-09-01 01:00:00 0.002301 0.4
2017-09-01 01:03:00 0.005601 0.4
在 SO 上搜索后,我发现一种方法是在 B 系列中创建一个“小时”列,然后使用 A 的索引和 B 的“小时”列将 A 连接到 B:(参考:Merging/combining two dataframes with different frequency time series indexes in Pandas?)
B = B.to_frame()
B['hour'] = B.index.to_period('H')
merged = B.join(A, on = 'hour', how = 'left')
但我收到错误消息:
TypeError: Argument 'values' has incorrect type (expected numpy.ndarray, got Index)
有谁知道如何解决这个问题?或者也许有更好的方式加入这两个系列?非常感谢!
【问题讨论】:
你为什么要将系列A
中的小时 01
与系列 B
中的小时 00
匹配?
因为这些是“自上一行以来的回报”。即 0.5 是 00:00 到 01:00 之间的返回。这可以使用 shift 命令进行调整,所以我的主要问题仍然是频率差异。 :(
我已经更新了我的答案 - 请检查
谢谢!所以诀窍是重新采样和填充!
【参考方案1】:
演示:
In [280]: A
Out[280]:
time
2017-09-01 01:00:00 0.5
2017-09-01 02:00:00 0.4
Name: val, dtype: float64
In [281]: B
Out[281]:
time
2017-09-01 00:00:00 NaN
2017-09-01 00:03:00 -0.000350
2017-09-01 00:06:00 0.000401
Name: val, dtype: float64
In [282]: B.to_frame('B').join(A.to_frame('A').set_index(A.index.shift(-1, freq='H')).resample('3T').ffill())
Out[282]:
B A
time
2017-09-01 00:00:00 NaN 0.5
2017-09-01 00:03:00 -0.000350 0.5
2017-09-01 00:06:00 0.000401 0.5
【讨论】:
对不起,我应该更清楚,但我想将合并的数据帧保持在分钟级别,即 B 的索引。这就是我使用的原因(how = 'left')。我已编辑问题以使其更具体。 @ian_chan,你能在你的问题中发布你想要的(输出)数据集吗? 确定。刚刚进行了更改。很抱歉给您带来不便以上是关于在python中合并具有不同时间频率的系列/数据帧的主要内容,如果未能解决你的问题,请参考以下文章
有没有一种pythonic方法可以将日期时间上的数据帧与具有不规则日期时间戳的数据对合并