100K+ 行数据集中的日期时间差(以秒为单位)

Posted

技术标签:

【中文标题】100K+ 行数据集中的日期时间差(以秒为单位)【英文标题】:Datetime difference in seconds in a 100K+ rows Dataset 【发布时间】:2020-02-10 08:05:15 【问题描述】:

我对 Python 和数据科学真的很陌生。

我有一个包含 100K+ 行的数据集,并且像 30 列(两个日期时间、27 个整数和 1 个字符串)。 我想通过计算我的两个日期时间列之间的差异来创建第 31 列,并在几秒钟内得到结果。另外,我想让“-5000”作为我两个日期之间的最小差异。

所以为了简单起见,我们只关注两个 Datetime 列。

目标是从这个出发:

        first_datetime        second_datetime
0  2019-03-13 04:35:30  2019-03-13 05:35:30
1  2019-03-13 05:35:30  2019-03-13 06:35:30
2  2019-03-13 05:35:30  2019-03-14 06:35:30

到这里:

   diff       first_datetime        second_datetime
0 -3600    2019-03-13 04:35:30  2019-03-13 05:35:30
1   -10    2019-03-13 05:35:30  2019-03-13 05:35:40
2 -5000    2019-03-13 05:35:30  2019-03-14 05:35:40

有人告诉我 .apply 函数是最快的,所以我用它来制作这个函数:

def calc_diff(row):
    diff=int((row['first_datetime']-row['second_datetime']).total_seconds())
    if diff<-5000:
         return -5000
    else:
         return diff

我将它与 .apply 函数一起使用:

df = pd.DataFrame(['first_datetime': "2019-03-13 04:35:30", 'second_datetime': "2019-03-13 05:35:30",'first_datetime': "2019-03-13 05:35:30", 'second_datetime': "2019-03-13 05:35:40"])

df['diff']=df.apply(calc_diff, axis=1) 

问题是我遇到了内存错误,我做错了什么?实现这一目标的最佳方法是什么?

【问题讨论】:

能否添加错误的完整回溯? 因为您的代码对我有用,如果您修复列名拼写错误。您在数据框中有'secod_datime',在calc_diff 中有'second_datetime'。所以也许只是一个错字。 @Valentino 的错字只是为了说明它,我不能用实际的数据集输入让它“容易理解” 列名必须匹配。如果它们不匹配,则会出现错误。正如我所说,如果你修正了错字,你的代码就会工作,你会得到预期的结果。那么真正的问题是什么? @Valentino 真正的问题是:如何在处理包含 100K+ 或 1M 行的大型数据集时实现这样的目标 【参考方案1】:

你可以试试:

df["diff"]= (df["first_datetime"]-df["second_datetime"]).dt.seconds.clip(lower=-5000)

编辑: 关于beetwen dt.seconds和dt.total_seconds()的区别:

(pd.Timestamp("2019-10-13 00:00:50")-pd.Timestamp("2019-10-10 00:00:00")).seconds                                    
Out: 50

(pd.Timestamp("2019-10-13 00:00:50")-pd.Timestamp("2019-10-10 00:00:00")).total_seconds()                            
Out: 259250.0

【讨论】:

我有这个错误AttributeError: 'Series' object has no attribute 'seconds',在返回差异结果之前,我想检查它是否小于-5000,如果是,我想将它设置为-5000(为了至少有-5000),我如何使用您的解决方案来实现这一目标? .dt.total_seconds()? @QuangHoang ,我在发表评论之前已经尝试过.total_seconds(),但它没有用。 .dt.total_seconds() 好像可以,请问他们有什么区别? 对于 pandas 时间序列,您需要dt 访问权限。对于 Pandas 时间索引,您不需要它。 @le fragan 也许您需要 total_seconds,因为 dt.seconds >= 0 且不到 1 天!

以上是关于100K+ 行数据集中的日期时间差(以秒为单位)的主要内容,如果未能解决你的问题,请参考以下文章

如何检查两个日期之间的差异(以秒为单位)?

mysql查询两个日期的时间间隔,以秒为单位

如何在jquery中以秒为单位获取两个日期之间的差异?

带有时区和夏令时的纪元的日期和时间(以秒为单位)

SQL 两次之间的差异(以秒为单位)

计算 SQL 中组的重叠时间(以秒为单位)