【问题标题】:Merging two DataFrames on closest UNIX Timestamp在最近的 UNIX 时间戳上合并两个 DataFrame
【发布时间】:2016-09-04 11:55:52
【问题描述】:

我有两组数据,通常长度不同,其中包含一个 UNIX 时间戳列。一个日期帧通常具有一致的间隔数据,而关闭有一些偏移,但仍然每 5 秒(0、5、10、15 对 3、8、13、18)是不可预测的。

               df1                            df2
0        1428796819     |      0        1428796800
1        1428796824     |      1        1428796805
2        1428796829     |      2        1428796810
3        1428796834     |      3        1428796815
4        1428796839     |      4        1428796820
5        1428796844     |      5        1428796825

我希望根据最近的日期合并这两个数据框。由于 df 长度不匹配,我可以接受“NaN”。 UNIX 时间戳采用“int64”格式。

任何想法都会很棒。

【问题讨论】:

  • 在上面的示例中,df1 中的许多值与df2 中的相同值最接近。例如,df1 中除第一个之外的所有值都最接近df2 中的最后一个值。在这种情况下,您希望如何合并行?期望的结果是什么?

标签: python pandas join merge timestamp


【解决方案1】:

您可以尝试像这样重新采样您的时间戳:

data = """\
ts
1428796819
1428796824
1428796829
1428796834
1428796839
1428796844
"""
df1 = pd.read_csv(io.StringIO(data), parse_dates=['ts'], date_parser=lambda x: pd.to_datetime(x, unit='s'))
df1['df1'] = range(len(df1))


data = """\
ts
1428796800
1428796805
1428796810
1428796815
1428796820
1428796825
"""
df2 = pd.read_csv(io.StringIO(data), parse_dates=['ts'], date_parser=lambda x: pd.to_datetime(x, unit='s'))
df2['df2'] = range(len(df2))


(df1.set_index('ts')
    .resample('5S')
    .last()
    .join(df2.set_index('ts')
             .resample('5S')
             .last(),
          rsuffix='_r')
)

测试:

In [88]: df1
Out[88]:
                   ts  df1
0 2015-04-12 00:00:19    0
1 2015-04-12 00:00:24    1
2 2015-04-12 00:00:29    2
3 2015-04-12 00:00:34    3
4 2015-04-12 00:00:39    4
5 2015-04-12 00:00:44    5

In [89]: df2
Out[89]:
                   ts  df2
0 2015-04-12 00:00:00    0
1 2015-04-12 00:00:05    1
2 2015-04-12 00:00:10    2
3 2015-04-12 00:00:15    3
4 2015-04-12 00:00:20    4
5 2015-04-12 00:00:25    5

In [90]: (df1.set_index('ts')
   ....:     .resample('5S')
   ....:     .last()
   ....:     .join(df2.set_index('ts')
   ....:              .resample('5S')
   ....:              .last(),
   ....:           rsuffix='_r')
   ....: )
Out[90]:
                     df1  df2
ts
2015-04-12 00:00:15    0  3.0
2015-04-12 00:00:20    1  4.0
2015-04-12 00:00:25    2  5.0
2015-04-12 00:00:30    3  NaN
2015-04-12 00:00:35    4  NaN
2015-04-12 00:00:40    5  NaN

【讨论】:

  • 对反应缓慢表示歉意。这是我最近的一次,非常感谢。我注意到比赛通常会落后一排。所以 HH:MM:04 匹配 HH:MM:00 而不是 .05。有什么想法吗?再次感谢您让我走到这一步。
猜你喜欢
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
  • 2016-12-12
  • 2021-06-13
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多