【问题标题】:how to merge dataframes with string timestamps of different frequency如何将数据帧与不同频率的字符串时间戳合并
【发布时间】:2017-10-24 07:06:36
【问题描述】:

我有 2 个来自不同来源的 csv 数据文件,我想合并它们。两个文件的每一行都有一个字符串时间戳,但周期非常不同——一个是每 2 秒,另一个是每小时。我可以将它们导入 Pandas,并尝试合并它们,但有两个问题。

1) 我可以使用 pd.to_datetime 将时间戳转换为 pandas datetime64 对象,但这会创建一个新系列,从而丢失数据列。转换可以“就地”完成吗? 我的尝试是: newdf = pd.to_datetime(calc_insol.iloc[:,0]) # calc_insol 是DF

2) 假设我可以将两个 DF 转换为正确的日期时间格式,考虑到时间戳期间的巨大差异,它们是否可以合并。

每个 DF 的摘录如下所示。字符串时间戳是 col 0,“数据”在 col 1 calc_insol:

0   2017-May-19 2:00:00 0
1   2017-May-19 3:00:00 0
2   2017-May-19 4:00:00 0
3   2017-May-19 5:00:00 0
4   2017-May-19 6:00:00 0
5   2017-May-19 7:00:00 0
6   2017-May-19 8:00:00 497.5
7   2017-May-19 9:00:00 685.2
8   2017-May-19 10:00:00    768.4
9   2017-May-19 11:00:00    806.3
10  2017-May-19 12:00:00    816.6
11  2017-May-19 13:00:00    803.1
12  2017-May-19 14:00:00    760.6
13  2017-May-19 15:00:00    668.7
14  2017-May-19 16:00:00    456.8
15  2017-May-19 17:00:00    0
16  2017-May-19 18:00:00    0
17  2017-May-19 19:00:00    0
18  2017-May-19 20:00:00    0
19  2017-May-19 21:00:00    0
20  2017-May-19 22:00:00    0
21  2017-May-19 23:00:00    0
22  2017-May-20 0

meas_insol:

2017-May-19 11:59:57    89.8
2017-May-19 11:59:59    80.57
2017-May-19 12:00:01    90.64
2017-May-19 12:00:03    93.15001
2017-May-19 12:00:05    85.6
2017-May-19 12:00:07    78.89
2017-May-19 12:00:09    85.6
2017-May-19 12:00:11    75.53
2017-May-19 12:00:13    93.99
2017-May-19 12:00:15    93.15001
2017-May-19 12:00:17    92.32
2017-May-19 12:00:19    87.28
2017-May-19 12:00:21    77.21
2017-May-19 12:00:23    92.32
2017-May-19 12:00:25    79.73001
2017-May-19 12:00:27    76.37001
2017-May-19 12:00:30    74.69
2017-May-19 12:00:32    88.96
2017-May-19 12:00:34    73.85
2017-May-19 12:00:36    78.89
2017-May-19 12:00:38    76.37001
2017-May-19 12:00:40    77.21
2017-May-19 12:00:42    88.12
2017-May-19 12:00:44    87.28
2017-May-19 12:00:46    88.12
2017-May-19 12:00:48    79.73001
2017-May-19 12:00:50    74.69
2017-May-19 12:00:52    77.21
2017-May-19 12:00:54    83.92
2017-May-19 12:00:56    73.85
2017-May-19 12:00:58    83.92
2017-May-19 12:01:00    83.08001
2017-May-19 12:01:02    74.69
2017-May-19 12:01:04    78.89
2017-May-19 12:01:06    73.85
2017-May-19 12:01:08    86.44
2017-May-19 12:01:10    74.69
2017-May-19 12:01:12    73.01
2017-May-19 12:01:14    68.82
2017-May-19 12:01:16    83.92

理想情况下,完成的 DF 将 col 0 作为日期时间对象,col 1 将是来自 calc_insol 的数据,而 col 2 将是来自 meas_insol 的数据。 任何帮助将不胜感激。

【问题讨论】:

  • 如果我的答案没有所需的输出,您可以将其添加到问题中吗?日期之间也没有匹配,你能改变它吗? (样本中的 3 -5 行是可以的)。谢谢。
  • 谢谢 - 我更改了数据选择,使它们重叠。还使用了您的建议,现在已经在每个文件中修复了时间戳。我现在无法检查合并,但明天回到办公室时会检查。
  • 对不起,现在我有点困惑 - 你需要先将meas_insol 上采样到hours 像calc_insol 然后合并吗?
  • 否 - calc_insol 列可以是稀疏的,因此 calc 的时间戳只有 1 小时,而 meas 的时间戳为 2 秒。在实践中,每 2 秒进行一次测量,但仅每小时计算一次。
  • 好的,那么它们的数据框是如何连接的?仅通过 calc_insol 的日期时间以小时精度计算?所以输出是 daframe,所有日期都从两个 df 匹配?

标签: python pandas


【解决方案1】:

我认为您需要创建新的 datetime 列并与它们合并,最后通过 drop 删除 new 列 - 然后原始列不会更改:

calc_insol['new'] = pd.to_datetime(calc_insol.iloc[:,0])
meas_insol['new'] = pd.to_datetime(meas_insol.iloc[:,1])
df = pd.merge(calc_insol, meas_insol, on='new')
#if necessary
df = df.drop('new',axis=1)

【讨论】:

  • 谢谢 - 这已经奏效了。即使没有关联的 calc_incol 数据,拥有所有 meas_insol 时间戳也会很有用。也许没有 on='new'?
  • 嗯,我认为需要how='left' 或how='right', ;)
  • 是的 - 这有效: df_merged = pd.merge(calc_insol, meas_insol, how = 'left', on='new') 这产生了一个包含所有数据的 df - 每小时时间戳(即hh:00:00) 同时具有 meas 和 calc,而 meas 对每个时间戳都有一个值。谢谢!
  • 超级棒。美好的一天!
猜你喜欢
  • 2020-03-07
  • 2019-06-22
  • 2013-05-26
  • 2019-11-19
  • 2021-09-05
  • 1970-01-01
  • 2020-10-13
  • 2020-11-18
相关资源
最近更新 更多