【问题标题】:only keep the last time stamp on certain day python只保留某天python的最后一个时间戳
【发布时间】:2018-12-19 01:26:12
【问题描述】:

对不起,我是 python 的菜鸟,只是需要指出正确的方向。

这是我正在处理的数据:

 2018-12-14 14:36:00
 2018-12-15 02:00:00
 2018-12-15 04:48:00
 2018-12-16 06:12:00
 2018-12-16 11:28:00
 2018-12-16 23:52:00

我需要做的是只保留每天的最后一个条目。将存储在 numpy 数组中的值附加到列表中是否明智?这会是我最好的选择吗?我问是因为我知道我不能从 numpy 数组中删除值。只是好奇从列表或 numpy 数组中执行此操作是否更容易?

【问题讨论】:

    标签: python date time


    【解决方案1】:

    我注意到你的时间是有序的。如果是这种情况,您可以简单地转换为 dict 以保留最后一个条目:

    >>> times
    ['2018-12-14 14:36:00',
     '2018-12-15 02:00:00',
     '2018-12-15 04:48:00',
     '2018-12-16 06:12:00',
     '2018-12-16 11:28:00',
     '2018-12-16 23:52:00']
    >>> print(*dict(s.split() for s in times).items(), sep='\n')
    ('2018-12-14', '14:36:00')
    ('2018-12-15', '04:48:00')
    ('2018-12-16', '23:52:00')
    

    如果排序不可靠,请排序 - 这会将时间复杂度降低到 O(n log n) 什么是 O( n) 任务。相反,您应该构建一个字典(键是日期,值是时间列表)并为字典值取最大值。

    【讨论】:

    • 排序可靠...数据来自定期上传数据的API。
    • 有没有办法从正在打印的日期的时间列表中获取索引值?
    • 是的,看看内置函数enumerate
    【解决方案2】:

    如果这是一个选项,您可以使用 pandas 数据帧中的一些工具。

    以下做了两个假设:

    1. 您的数据已按时间戳排序;
    2. 您添加了一个额外的列进行分组,这将丢弃时间戳中的时间,以便您可以按天分组。

      my_dataframe.groupby(['my_date_only_column']).my_timestamp_column.last()
      

    【讨论】:

      【解决方案3】:

      如果您的数据没有排序,您也可以将日期存储在collections.defaultdict(),然后取最大值datetime

      from collections import defaultdict
      from datetime import datetime
      
      data = [
          '2018-12-14 14:36:00',
          '2018-12-15 02:00:00',
          '2018-12-15 04:48:00',
          '2018-12-16 06:12:00',
          '2018-12-16 11:28:00',
          '2018-12-16 23:52:00'
      ]
      
      d = defaultdict(list)
      for item in data:
          date, _ = item.split()
          d[date].append(item)
      
      print([max(v, key=lambda x: datetime.strptime(x, "%Y-%m-%d %H:%M:%S")) for _, v in d.items()])
      # ['2018-12-14 14:36:00', '2018-12-15 04:48:00', '2018-12-16 23:52:00']
      

      上面使用datetime.datetime.strptime() 来获取最大日期时间,如key 参数中所指定。

      如果您的数据已经排序,您可以利用itertools.groupby()

      from itertools import groupby
      
      data = [
          '2018-12-14 14:36:00',
          '2018-12-15 02:00:00',
          '2018-12-15 04:48:00',
          '2018-12-16 06:12:00',
          '2018-12-16 11:28:00',
          '2018-12-16 23:52:00'
      ]
      
      print([list(g)[-1] for _, g in groupby(data, key=lambda x: x.split()[0])])
      # ['2018-12-14 14:36:00', '2018-12-15 04:48:00', '2018-12-16 23:52:00']
      

      【讨论】:

        猜你喜欢
        • 2014-10-25
        • 1970-01-01
        • 2019-02-19
        • 1970-01-01
        • 1970-01-01
        • 2023-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多