Python SQL查询中的数据帧:日期差异显示错误

Python SQL查询中的数据帧:日期差异显示错误,python,postgresql,pandas,dataframe,Python,Postgresql,Pandas,Dataframe,给定红移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'

给定红移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
我需要得到字段的最大值,因为可以有多行具有相同的值,所以这是一种获得一行的方法

我从SQL UI中得到以下结果:

现在,当我运行与

import pandas as pd

df = pd.read_sql_query(q, engine)

其中q是上面的查询字符串,我得到,尽管day_diff是正确的,diff列始终显示“0 days 00:00:00”,好像它被转换了,但它是错误的。引擎变量来自sqlalchemy.create_engineconnection_字符串,我使用该字符串连接到数据库

如果你能得到我在评论中描述的秒数,你可以将它们转换成所需的格式

假设您拥有数据帧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)

你有没有试着在几秒钟内提取差异,就像你在几天内做的那样?它看起来真的像一个日期类型转换的东西。@JanZeiseweis正在提取任何可以工作的部分,如图所示。但是我想看看完整的diff对象,问题是转换发生在哪里,以及如何防止它。当你说完整的diff对象时,你到底是什么意思?使用这个查询怎么样:选择created_at,从ASC创建的创建的创建的创建的创建的作为差异提取“秒”,从ASC创建的创建的作为日期差异提取“天”,从选择MAXcreated创建的作为差异从表组中选择MAXcreated创建的作为差异从ASC创建的作为差异从表组中选择MAXcreated创建的作为差异从ASC创建的作为差异从表组中选择MAXcreated创建的作为差异,您可以使用python/pandas以您想要的方式显示它们。@JanZeiseweis我的意思是我希望从SQL UI中看到上面图像中的内容,而不是pandas,而不是看到所有0。根据你的查询,我只得到了几秒钟。也许你的意思是用约会工具,但我也想知道熊猫在做什么!