如何合并两个不同的数据帧,时间戳略有不同

Posted

技术标签:

【中文标题】如何合并两个不同的数据帧,时间戳略有不同【英文标题】:How to merge two different dataframe with a slight difference in timestamp 【发布时间】:2019-11-19 21:03:03 【问题描述】:

我从 10 秒的记录数据中计算出 15 分钟的移动平均值。现在我想根据最近的时间戳将来自不同文件的两个时间序列数据(15 分钟平均值和 15 分钟移动平均值)合并到一个新文件中。

15 分钟移动平均数据如下。正如我计算的移动平均线,前几行是 NaN:

RecTime NO2_RAW NO2 Ox_RAW  Ox  CO_RAW  CO  SO2_RAW SO2
2019-06-03 00:00:08 NaN NaN NaN NaN NaN NaN NaN NaN
2019-06-03 00:00:18 NaN NaN NaN NaN NaN NaN NaN NaN
2019-06-03 00:00:28 NaN NaN NaN NaN NaN NaN NaN NaN
2019-06-03 00:00:38 NaN NaN NaN NaN NaN NaN NaN NaN

15分钟平均数据如下图:

    Site    Species ReadingDateTime   Value Units   Provisional or Ratified
0   CR9       NO2   2019-03-06 00:00:00 8.2 ug m-3  P
1   CR9       NO2   2019-03-06 00:15:00 7.6 ug m-3  P
2   CR9       NO2   2019-03-06 00:30:00 5.9 ug m-3  P
3   CR9       NO2   2019-03-06 00:45:00 5.1 ug m-3  P
4   CR9       NO2   2019-03-06 01:00:00 5.2 ug m-3  P

我想要一张这样的桌子:

ReadingDateTime Value   NO2_Raw NO2
2019-06-03 00:00:00         
2019-06-03 00:15:00         
2019-06-03 00:30:00         
2019-06-03 00:45:00         
2019-06-03 01:00:00 

我试图将两个数据框与最近的时间进行匹配

df3 = pd.merge_asof(df1, df2, left_on = 'RecTime', right_on = 'ReadingDateTime', tolerance=pd.Timedelta('59s'), allow_exact_matches=False)

我有一个新的数据框

    RecTime NO2_RAW NO2 Ox_RAW  Ox  CO_RAW  CO  SO2_RAW SO2 Site    Species ReadingDateTime Value   Units   Provisional or Ratified
0   2019-06-03 00:14:58 1.271111    21.557111   65.188889   170.011111  152.944444  294.478000  -124.600000 -50.129444  NaN NaN NaT NaN NaN NaN
1   2019-06-03 00:15:08 1.294444    21.601778   65.161111   169.955667  152.844444  294.361556  -124.595556 -50.117556  NaN NaN NaT NaN NaN NaN
2   2019-06-03 00:15:18 1.318889    21.648556   65.104444   169.842556  152.750000  294.251556  -124.593333 -50.111667  NaN NaN NaT NaN NaN NaN

但是 df2 的值变成了 NaN。有人可以帮忙吗?

【问题讨论】:

您想如何合并它们?您的预期输出是什么? 我希望时间戳列类似于 15 分钟平均值,并添加来自 15 分钟移动平均值的 NO2_Raw 和 NO2 值以及基于类似时间戳的 15 分钟平均值的值。 编辑您的问题并添加预期的输出,以便我们可以直观地看到您尝试做什么 【参考方案1】:

假设分钟是正确的,您可以删除秒,然后您就可以合并。

df.RecTime.map(lambda x: x.replace(second=0))

您可以创建一个新列或替换现有列进行合并。

【讨论】:

我试过这样做,但由于它是 10 秒的移动平均数据,因此它在一分钟内有多个数据。我应该如何完全匹配? 您可以使用辅助列在几分钟内进行合并,这样您就不会丢失原始时间戳。如果你想减少它,你可以使用 groupby。 你能告诉我具体怎么做吗? 您的问题是如何合并 2,因此您应该先阅读有关合并的文档。合并列需要是相同的数据类型 [pandas.pydata.org/pandas-docs/stable/reference/api/… Concat 与合并不同。 是的,我明白了。但是 ReadingDateTime 和 RecTime 都只是 datetime64[ns]。我是python新手,能帮我解决一下问题吗?

以上是关于如何合并两个不同的数据帧,时间戳略有不同的主要内容,如果未能解决你的问题,请参考以下文章

熊猫合并具有不同时间戳的数据帧一

在时间戳略有不同的2个不同数据库中的表之间连接(MySQL)

总结来自不同流的图,但时间戳略有不同

向前搜索时合并两个数据帧

将数据帧与时间戳和间隔合并

合并两个 Pandas 数据帧,在一个时间列上重新采样,插值