鉴于Redshift(PostgreSQL)中的一个表包含一个名为created_at
的列,其类型为timestamptz,例如2015-04-01 07:08:32.631 + 00。
我编写了一个查询来计算任意两对有序行之间的差异(以天为单位)(在此字段上排序)。查询是
SELECT created_at,
created_at - LAG(created_at) OVER(ORDER BY created_at ASC) AS diff,
EXTRACT('day' FROM created_at - LAG(created_at) OVER(ORDER BY created_at ASC)) AS day_diff
FROM
(SELECT MAX(created_at) as created_at
FROM table
GROUP BY created_at)
ORDER BY created_at ASC
我需要得到字段的MAX,因为可能有多个行具有相同的值,所以这是获得一个的方法。
我从SQL UI获得了这些结果:
现在,当我运行相同的查询并构建一个DataFrame
时import pandas as pd
df = pd.read_sql_query(q, engine)
其中q
是上面的查询字符串,我得到的是尽管day_diff是正确的,但是diff列总是显示'0天00:00:00',好像它以某种方式被转换而且它是错误的。 engine
var来自sqlalchemy.create_engine(connection_string)
,我用它来连接数据库。
答案 0 :(得分:2)
如果您可以按我在评论中描述的那样获得秒数,则可以将它们转换为所需的格式。
假设你有你的DataFrame df:
def format_seconds(seconds):
days, reminder = divmod(seconds, 60*60*24)
hours, reminder = divmod(reminder, 60*60)
minutes, reminder = divmod(reminder, 60)
return "%d days %02d:%02d:%02d" % (days, hours, minutes, reminder)
df['formated_diff'] = df['diff'].apply(format_seconds)