gpt4 book ai didi

python - 连接具有不同日期时间频率的数据帧

转载 作者:太空宇宙 更新时间:2023-11-04 03:41:36 24 4
gpt4 key购买 nike

我有一些稀疏的高频数据(间隔不均匀)和一些低频数据(每天)。
如果那天落在较高频率的数据上,我如何加入这些数据并将相应的低频数据列附加到较高频率的数据中?

一种方法是创建自定义应用函数并检查每个数据的 YMD 并查找相应的低频数据,但这似乎效率很低。

这是一个演示问题的 DataFrame 示例:

df1 = DataFrame(dict(date1 = date_range(start='20100101', periods=48, freq='H'),value1=range(48)))
df2 = DataFrame(dict(date2 = date_range(start='20100101', periods=2, freq='D'),value2=range(2)))

我试过 pd.merge 和 pd.join,但它们不匹配并产生 NaN。

merge(df1,df2,left_on='date1',right_on='date2',how='outer')

date1 value1 date2 value2
0 2010-01-01 00:00:00 0 2010-01-01 0
1 2010-01-01 01:00:00 1 NaT NaN
2 2010-01-01 02:00:00 2 NaT NaN
3 2010-01-01 03:00:00 3 NaT NaN
...
1 2010-01-01 01:00:00 1 2010-01-02 1
24 2010-01-02 00:00:00 24 NaT NaN
25 2010-01-02 01:00:00 25 NaT NaN
...
30 2010-01-02 06:00:00 30 NaT NaN
31 2010-01-02 07:00:00 31 NaT NaN

我希望的输出应该让 value2 对 1 号的所有内容都为 0,对 2 号的所有内容都为 1:

                 date1  value1      date2  value2
0 2010-01-01 00:00:00 0 2010-01-01 0
1 2010-01-01 01:00:00 1 2010-01-01 0
2 2010-01-01 02:00:00 2 2010-01-01 0
3 2010-01-01 03:00:00 3 2010-01-01 0
...
29 2010-01-02 05:00:00 29 2010-01-02 1
30 2010-01-02 06:00:00 30 2010-01-02 1
31 2010-01-02 07:00:00 31 2010-01-02 1

最佳答案

注意:您可以通过合并非常干净地完成此操作(假设没有重叠的列):

In [41]: df1['date2'] = pd.DatetimeIndex(df1['date1']).normalize()

In [42]: pd.merge(df1, df2).head()
Out[42]:
date1 value1 date2 value2
0 2010-01-01 00:00:00 0 2010-01-01 0
1 2010-01-01 01:00:00 1 2010-01-01 0
2 2010-01-01 02:00:00 2 2010-01-01 0
3 2010-01-01 03:00:00 3 2010-01-01 0
4 2010-01-01 04:00:00 4 2010-01-01 0

原始答案,我认为可能更有效率。就是用重新索引来做到这一点:

为了让事情更简单,我们将 date2 设置为索引:

In [11]: df2 = df2.set_index('date2')

现在在一天的开始重新索引(使用 normalize,在 0.15 中你将能够使用 .dt.normalize()):

In [12]: pd.DatetimeIndex(df1.date1).normalize()
Out[12]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2010-01-01, ..., 2010-01-02]
Length: 48, Freq: None, Timezone: None

In [13]: df2.reindex(pd.DatetimeIndex(df1.date1).normalize()).head()
Out[13]:
value2
2010-01-01 0
2010-01-01 0
2010-01-01 0
2010-01-01 0
2010-01-01 0

您必须使用这些值来避免 pandas 在索引上重新对齐:

In [14]: df1['value2'] = df2.reindex(pd.DatetimeIndex(df1.date1).normalize()).values

In [15]: df1.head()
Out[15]:
date1 value1 value2
0 2010-01-01 00:00:00 0 0
1 2010-01-01 01:00:00 1 0
2 2010-01-01 02:00:00 2 0
3 2010-01-01 03:00:00 3 0
4 2010-01-01 04:00:00 4 0

关于python - 连接具有不同日期时间频率的数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26170788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com