【问题标题】:Python 2.6 - How to obtain the o'clock-time from timestampPython 2.6 - 如何从时间戳获取点时间
【发布时间】:2017-04-04 17:08:01
【问题描述】:

我正在使用一个 cx_Oracle 数据库,其记录具有每个 timestampvalue 列。我需要为每小时存储的记录(每天 24 个插槽:00-01、01-02...23-00)详细说明 avg、min、sum 或其他聚合函数(根据配置文件)。每个表都以不同的时间戳开始,可能是十年前或昨天,所以我应该考虑从第一个时间戳的小时开始聚合记录。假设第一个时间戳是 14h:43m:20s,则这条记录将存储在 14-15 槽中。问题是计算对应于该时间戳的 14:00 点的时间戳的最佳方法是什么?然后我想使用timedelta + 1h 算术继续一小时并做我需要的事情。无论如何,如果这不是最好的方法,我接受任何建议。

【问题讨论】:

  • 不应该在 SQL 中而不是在 Python 中进行分组和聚合吗?

标签: python datetime time timedelta


【解决方案1】:

您的问题更多是关于 SQL 而不是 python。这就是我通过 SQL 获得平均值(或其他聚合)的方式。

select avg(EXTRACT(HOUR FROM <timestamp>)) as avg_hrs, 
min(EXTRACT(HOUR FROM <timestamp>)) as min_hrs, 
sum(EXTRACT(HOUR FROM <timestamp>)) as sum_hrs
from <table>;

总和没有意义,但我留给你去发现它的用处。 这是另一个计数查询。希望这会有所帮助。

select EXTRACT(HOUR FROM <timestamp>) as hrs, count(*) as cnt
from <table>
group by EXTRACT(HOUR FROM <timestamp>)
order by 1;

【讨论】:

  • 谢谢,我想通过 SQL 工作,但问题是表有另一列 name 我需要分组,然后按 timestamp 排序。我的意思是...ORDER BY name, timestamp,我必须处理来自timestamp 排序的特定name 的所有记录,然后使用聚合函数对它们进行分组。所以,我不能只按时间戳分组,因为它们可能属于不同的name 值。我希望我的意思很清楚。
  • 我正在尝试使用 select avg(EXTRACT(HOUR FROM 1435047532)) as hour,但返回此错误:invalid extract field for extract source我错在哪里?
  • 1435047532 不是时间戳,而是时间戳类型的数据的值。因此,如果您从中获取 HOUR 值,那将没有意义,因为它不是日期时间戳类型的数据。请给我一个包含列名和您想要实现的表的示例数据(例如按此列分组然后平均此列..等)
  • 谢谢,我试着解释一下。假设列是 timehostvalue。我需要的是 host 之前的结果顺序,然后是每个主机的时间戳。然后,单独谈论一个主机,我必须用一小时的步骤和聚合函数(例如 AVG、SUM ......)对结果进行分组。由 14:00 到 14:59:59 之间的结果聚合产生的记录必须具有相同日期但用 0 分和 0 秒表示小时的时间戳(例如 14:00:00)。那些在 15:00 到 15:59:59 之间的时间戳以 15:00:00 结尾,以此类推。这适用于每个不同的主机
猜你喜欢
  • 2019-08-09
  • 2014-11-21
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
相关资源
最近更新 更多