【问题标题】:Merging time series data by timestamp using numpy/pandas使用 numpy/pandas 按时间戳合并时间序列数据
【发布时间】:2015-08-27 19:12:50
【问题描述】:

我有来自三个完全不同的传感器源的时间序列数据作为 CSV 文件,并希望将它们组合成一个大的 CSV 文件。 我已经设法使用 numpy 的 genfromtxt 将它们读入 numpy,但我不知道从这里做什么。

基本上,我所拥有的是这样的:

表 1:

timestamp    val_a   val_b   val_c

表 2:

timestamp    val_d   val_e   val_f   val_g

表 3:

timestamp    val_h   val_i

所有时间戳都是 UNIX 毫秒时间戳,如 numpy.uint64。

而我想要的是:

timestamp    val_a   val_b   val_c   val_d   val_e   val_f   val_g   val_h   val_i

...所有数据按时间戳组合和排序。这三个表中的每一个都已按时间戳排序。 由于数据来自不同的来源,因此不能保证表 1 中的时间戳也会在表 2 或表 3 中,反之亦然。在这种情况下,空值应标记为 N/A。

到目前为止,我已经尝试使用 pandas 来转换数据,如下所示:

df_sensor1 = pd.DataFrame(numpy_arr_sens1)
df_sensor2 = pd.DataFrame(numpy_arr_sens2)
df_sensor3 = pd.DataFrame(numpy_arr_sens3)

然后尝试使用 pandas.DataFrame.merge,但我很确定这不适用于我现在尝试做的事情。谁能指出我正确的方向?

【问题讨论】:

  • 您能否展示您使用merge 尝试过的内容,例如,如果您使用merged = pd.merge(df_sensor1, df_sensor_2, on='timestamp') 然后重复df_seonsor3,或者如果您将索引设置为所有dfs 上的时间戳,它应该可以工作那么你可以做pd.concat([df_sensor_1, df_seonsor2, df_sensor3])
  • 感谢您的快速回答!我使用了merge,就像你写的一样,但这显然是一个内部连接,所以只有在所有表中都有时间戳的数据点才会写入合并表。我也尝试过外连接,它确实包含所有数据,但也没有正确排序。我只是尝试了concat。我做了merged = pd.concat([df_sensor1, df_sensor2, df_sensor3], axis=1)merged.to_csv('out.csv', sep=';', header=True, index=True, na_rep='N/A'),这似乎完成了这项工作。我明天必须验证它。

标签: python numpy pandas


【解决方案1】:

我认为你可以简单地

  • timestamp定义为每个DataFrameindex(使用set_index
  • 使用join 将它们与'outer' 方法合并
  • 可选地将timestamp 转换为datetime

这是它的样子。

# generating some test data
timestamp = [1440540000, 1450540000]
df1 = pd.DataFrame(
    {'timestamp': timestamp, 'a': ['val_a', 'val2_a'], 'b': ['val_b', 'val2_b'], 'c': ['val_c', 'val2_c']})
# building a different index
timestamp = timestamp * np.random.randn(abs(1))
df2 = pd.DataFrame(
    {'timestamp': timestamp, 'd': ['val_d', 'val2_d'], 'e': ['val_e', 'val2_e'], 'f': ['val_f', 'val2_f'],
     'g': ['val_g', 'val2_g']}, index=index)
# keeping a value in common with the first index
timestamp = [1440540000, 1450560000]
df3 = pd.DataFrame({'timestamp': timestamp, 'h': ['val_h', 'val2_h'], 'i': ['val_i', 'val2_i']}, index=index)

# Setting the timestamp as the index
df1.set_index('timestamp', inplace=True)
df2.set_index('timestamp', inplace=True)
df3.set_index('timestamp', inplace=True)

# You can convert timestamps to dates but it's not mandatory I think
df1.index = pd.to_datetime(df1.index, unit='s')
df2.index = pd.to_datetime(df2.index, unit='s')
df3.index = pd.to_datetime(df3.index, unit='s')

# Just perform a join and that's it
result = df1.join(df2, how='outer').join(df3, how='outer')
result

【讨论】:

  • 如果你使用这个解决方案并且有很多表(或者它们的动态数量未知),那么可以将join 操作放在reduce 函数中,这意味着更少的代码。另外,我相信pandas.merge() 将概括上面使用的join() 方法。首先是from functools import reduce,然后是result = reduce(lambda left, right: pd.merge(left, right, left_on='timestamp', right_on='timestamp', how='outer'), df_list) - 最后一个参数df_list 是您的DataFrames 列表,例如df_list = [df1, df2, df3, ..., df_n].
  • @n1k31t4 另外还应将left_indexright_index 设置为True。有pd.merge(left, right, left_on='timestamp', right_on='timestamp', how='outer', lefT_index=True, right_index=True)
猜你喜欢
  • 2016-03-02
  • 2021-11-08
  • 1970-01-01
  • 2022-11-27
  • 2021-06-22
  • 2013-09-18
  • 1970-01-01
  • 2013-02-01
  • 2019-08-09
相关资源
最近更新 更多