【问题标题】:timedelta csv pandastimedelta csv 熊猫
【发布时间】:2012-11-01 01:19:51
【问题描述】:

我有以下文件 (df_SOF1.csv),它有 100 万条记录

Location,Transport,Transport1,DateOccurred,CostCentre,D_Time,count
0,Lorry,Car,07/09/2012,0,0:00:00,2
1,Lorry,Car,11/09/2012,0,0:00:00,5
2,Lorry,Car,14/09/2012,0,0:00:00,30
3,Lorry,Car,14/09/2012,0,0:07:00,2
4,Lorry,Car,14/09/2012,0,0:29:00,1
5,Lorry,Car,14/09/2012,0,3:27:00,3
6,Lorry,Car,14/09/2012,0,3:28:00,4
7,Lorry,Car,21/09/2012,0,0:00:00,13
8,Lorry,Car,27/09/2012,0,0:00:00,8
9,Lorry,Car,28/09/2012,0,0:02:00,1
10,Train,Bus,03/09/2012,2073,7:49:00,1
11,Train,Bus,05/09/2012,2073,7:50:00,1
12,Train,Bus,06/09/2012,2073,7:52:00,1
13,Train,Bus,07/09/2012,2073,7:48:00,1
14,Train,Bus,08/09/2012,2073,7:55:00,1
15,Train,Bus,11/09/2012,2073,7:49:00,1
16,Train,Bus,12/09/2012,2073,7:52:00,1
17,Train,Bus,13/09/2012,2073,7:50:00,1
18,Train,Bus,14/09/2012,2073,7:54:00,1
19,Train,Bus,18/09/2012,2073,7:51:00,1
20,Train,Bus,19/09/2012,2073,7:50:00,1
21,Train,Bus,20/09/2012,2073,7:51:00,1
22,Train,Bus,21/09/2012,2073,7:52:00,1
23,Train,Bus,22/09/2012,2073,7:53:00,1
24,Train,Bus,23/09/2012,2073,7:49:00,1
25,Train,Bus,24/09/2012,2073,7:54:00,1
26,Train,Bus,25/09/2012,2073,7:55:00,1
27,Train,Bus,26/09/2012,2073,7:53:00,1
28,Train,Bus,27/09/2012,2073,7:55:00,1
29,Train,Bus,28/09/2012,2073,7:53:00,1
30,Train,Bus,29/09/2012,2073,7:56:00,1

我正在使用 pandas 来分析它我已经尝试了至少 40 小时 找到一种方法来对数据进行分组,以便我可以聚合时间列D_Time

我已经加载了所需的模块 我使用DateOccured 作为索引创建了一个数据框,见下文

df_SOF1 = read_csv('/users/fabulous/documents/df_SOF1.csv', index_col=3, parse_dates=True) # read file from disk

我可以按任何列分组或遍历任何行,例如

df_SOF1.groupby('Location').sum()

但是我还没有找到一种方法来总结并使用 pandas 对 D_Time 列取平均值。我已经阅读了 20 多篇关于 timedeltas 等的文章,但我仍然不知道如何在 pandas 中做到这一点。

任何可以让我在 D_Time 列上进行算术运算的解决方案将不胜感激。 (即使必须在 pandas 之外完成)。

我认为一种可能的解决方案是将D_Time 列更改为秒。 __________________________________2012/11/01 我在上面的 30 项上运行了以下命令

df_SOF1.groupby('Transport').agg({'D_Time': sum})

D_Time

交通
货车 0:00:000:00:000:00:000:07:000:29:003:27:003:28... 火车 7:49:007:50:007:52:007:48:007:55:007:49:007:52..

这似乎是对这些值进行物理求和,而不是给出一个数字总和(如添加字符串)

干杯

【问题讨论】:

  • 这是一个有趣的问题标题。
  • 提问的时候有点累,哈哈!
  • 您能否提供一个示例:取 3 行并显示您正在尝试执行的操作以及您期望的结果(提供具体的输出)。我不明白'7:53:00' + '7:56:00' 可能意味着什么。能够to substruct times you could combine date/time columns
  • 您如何发现 pandas 可以处理一百万条记录?我也有一个大数据集,只是读取文件需要很长时间......

标签: python pandas


【解决方案1】:

我没有在 pandas 中找到任何关于 deltatime 的提及,而 datetime 模块有一个,因此将 D_Time 转换为秒是一个不错的主意:

def seconds(time_str):
    end_time = datetime.datetime.strptime(time_str,'%H:%M:%S')
    delta = end_time - datetime.datetime.strptime('0:0:0','%H:%M:%S')
    return delta.total_seconds()


df_SOF1.D_Time = df_SOF1.D_Time.apply(seconds)

结果:

>>> df_SOF1.groupby('CostCentre').sum()
            Location  D_Time  count
CostCentre                         
0                 45   27180     69
2073             420  594660     21

将 datetime.datetime.strptime('0:0:0','%H:%M:%S') 移动到全局命名空间可以减少执行时间:

timeit.timeit("sec('01:01:01')", setup="from __main__ import sec",
              number=10000)
1.025843858718872

timeit.timeit("seconds('01:01:01')", setup="from __main__ import seconds",
              number=10000)
0.6128969192504883 

【讨论】:

  • 很多很多谢谢,看起来恰到好处,我现在就试一试,让你知道我的进展如何。大声笑!
  • 嗨 adray 我运行了上面的函数,但是在 AttributeError 下得到了上面的错误:type object 'datetime.datetime' has no attribute 'datetime' 我相信它与我正在运行的导入数据时间有关python 2.7 你如何导入你的 datetime 模块。问候乔治
  • 看来,你做了“从日期时间导入日期时间”。只需从标准库中“导入日期时间”,所以这应该不是问题。您可以“dir(datetime)”来检查可用的方法
  • 糟糕,我也需要导入时间,感谢您的帮助 :o)
  • 我已经接受了这个答案,我的程序正在运行 yippee!
猜你喜欢
  • 2019-05-12
  • 1970-01-01
  • 2016-08-06
  • 2018-10-31
  • 2019-04-29
  • 2019-05-21
  • 2017-12-23
  • 2019-05-01
  • 1970-01-01
相关资源
最近更新 更多