SQL查询中的Pandas DataFrame:错误地显示日期差异

时间:2017-02-01 11:10:58

标签: python postgresql pandas dataframe

鉴于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获得了这些结果:

enter image description here

现在,当我运行相同的查询并构建一个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),我用它来连接数据库。

1 个答案:

答案 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)