【问题标题】:Merge Pandas Dataframes based on same hour基于同一小时合并 Pandas 数据框
【发布时间】:2018-04-13 03:14:33
【问题描述】:

我有每小时间隔的值的历史记录,并且我想在数据框中添加一列,以显示每天该小时的平均值。因此,如果 4:00 的平均值是 34,我希望每个 4:00 小时的日期在名为“平均值”的列中都有 34。现在,我可以在表格中获得带有小时数的平均值,但似乎无法让它加入多个位置。

Timestamp              Value
2018-04-12 13:00:00     12.0
2018-04-12 12:00:00     38.0
2018-04-12 11:00:00     12.0
2018-04-12 10:00:00     28.0
2018-04-12 09:00:00     26.0
2018-04-12 08:00:00     22.0
...

       Average
00:00   7.0
01:00   0.0
02:00   0.0
03:00   0.0
04:00   0.0
05:00   1.5
06:00   11.5
07:00   11.0
08:00   10.5
...

目标:

Timestamp              Value    Average
2018-04-12 13:00:00     12.0      8.5
2018-04-12 12:00:00     38.0      8.4
2018-04-12 11:00:00     12.0     15.5
2018-04-12 10:00:00     28.0     19.0
2018-04-12 09:00:00     26.0     12.4
2018-04-12 08:00:00     22.0     10.5

我尝试过合并和加入,但还没有弄清楚如何手动循环来完成它。

【问题讨论】:

  • 您能否展示一下您是如何获得平均值的,也许还有更多的数据框?现在它没有重复的小时数来计算平均值。
  • 如果平均值是预先计算的并且您只是想合并两个数据帧,您可以使用leftmerge。确保带有Timestamps 的数据框是left 数据框。
  • 从这个剪切和粘贴中,不清楚您的“时间戳”列是包含日期和时间的实际时间戳、包含日期和时间的字符串,还是包含日期和列的索引时间。如果它是前两个选项之一,您需要在进行合并之前对其进行不同的处理以自行获取小时。
  • 感谢cmets,下面的答案把它钉在了头上。 Hour 字段是字符串格式的,但很容易将它们转换回日期时间。我得到了平均值:group_date = [datetime.datetime.strftime(e, '%H:%M') for e in df.index]avgs = df.groupby(group_date)['Value'].mean()'

标签: python pandas


【解决方案1】:

如果您使用pd.to_datetime() 将它们转换为日期时间,这非常简单,然后您可以在.dt.hour 上合并。

import pandas as pd
df1 = pd.DataFrame({'Timestamp': ['2018-04-12 13:00:00','2018-04-12 12:00:00',
    '2018-04-12 11:00:00','2018-04-12 10:00:00','2018-04-12 09:00:00','2018-04-12 08:00:00'],
    'Value': [12, 38, 12, 28, 26, 22]})
df2 = pd.DataFrame({'Hour': ['00:00','01:00','02:00','03:00','04:00',
                            '05:00','06:00','07:00', '08:00'],
                   'Average': [7, 0,0,0,0,1.5, 11.5, 11, 10.5]})

df1['Timestamp'] = pd.to_datetime(df1.Timestamp)
df2['Hour'] = pd.to_datetime(df2.Hour)

现在好了,它将小时转换为日期时间对象,以今天作为当前日期,但由于我们只是在小时合并,所以没关系。

df1.merge(df2, left_on=df1.Timestamp.dt.hour, right_on=df2.Hour.dt.hour, how='left').drop(columns='Hour')
#            Timestamp  Value  Average
#0 2018-04-12 13:00:00     12      NaN
#1 2018-04-12 12:00:00     38      NaN
#2 2018-04-12 11:00:00     12      NaN
#3 2018-04-12 10:00:00     28      NaN
#4 2018-04-12 09:00:00     26      NaN
#5 2018-04-12 08:00:00     22     10.5

只有这么多非合并,因为您提供的样本数据在每组中只有 08:00 重叠。

或不转换:

mt = pd.to_datetime(df1.Timestamp).dt.hour
mh = pd.to_datetime(df2.Hour).dt.hour

df1.merge(df2, left_on=mt, right_on=mh, how='left').drop(columns=['Hour'])

【讨论】:

  • 很好,但是您可以在.hour 之后删除.values
  • 哦,不错。我忘记了为什么我需要那个。我会更新的
  • 完美运行。我不知道“on”值的“dt.hour”。巧妙的把戏。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多