【问题标题】:python pandas extract unique dates from time seriespython pandas从时间序列中提取唯一日期
【发布时间】:2013-01-18 08:45:17
【问题描述】:

我有一个包含大量日内数据的 DataFrame,DataFrame 有几天的数据,日期不连续。

 2012-10-08 07:12:22            0.0    0          0  2315.6    0     0.0    0
 2012-10-08 09:14:00         2306.4   20  326586240  2306.4  472  2306.8    4
 2012-10-08 09:15:00         2306.8   34  249805440  2306.8  361  2308.0   26
 2012-10-08 09:15:01         2308.0    1   53309040  2307.4   77  2308.6    9
 2012-10-08 09:15:01.500000  2308.2    1  124630140  2307.0  180  2308.4    1
 2012-10-08 09:15:02         2307.0    5   85846260  2308.2  124  2308.0    9
 2012-10-08 09:15:02.500000  2307.0    3  128073540  2307.0  185  2307.6   11
 ......
 2012-10-10 07:19:30            0.0    0          0  2276.6    0     0.0    0
 2012-10-10 09:14:00         2283.2   80   98634240  2283.2  144  2283.4    1
 2012-10-10 09:15:00         2285.2   18  126814260  2285.2  185  2285.6    3
 2012-10-10 09:15:01         2285.8    6   98719560  2286.8  144  2287.0   25
 2012-10-10 09:15:01.500000  2287.0   36  144759420  2288.8  211  2289.0    4
 2012-10-10 09:15:02         2287.4    6  109829280  2287.4  160  2288.6    5
 ......

如何从上述 DataFrame 中提取日期时间格式的唯一日期?得到像[2012-10-08, 2012-10-10]这样的结果

【问题讨论】:

    标签: python datetime dataframe pandas time-series


    【解决方案1】:

    如果你有Series 喜欢:

    In [116]: df["Date"]
    Out[116]: 
    0           2012-10-08 07:12:22
    1           2012-10-08 09:14:00
    2           2012-10-08 09:15:00
    3           2012-10-08 09:15:01
    4    2012-10-08 09:15:01.500000
    5           2012-10-08 09:15:02
    6    2012-10-08 09:15:02.500000
    7           2012-10-10 07:19:30
    8           2012-10-10 09:14:00
    9           2012-10-10 09:15:00
    10          2012-10-10 09:15:01
    11   2012-10-10 09:15:01.500000
    12          2012-10-10 09:15:02
    Name: Date
    

    其中每个对象都是一个Timestamp

    In [117]: df["Date"][0]
    Out[117]: <Timestamp: 2012-10-08 07:12:22>
    

    您只能通过调用.date()获取日期:

    In [118]: df["Date"][0].date()
    Out[118]: datetime.date(2012, 10, 8)
    

    和 Series 有一个 .unique() 方法。所以你可以使用maplambda

    In [126]: df["Date"].map(lambda t: t.date()).unique()
    Out[126]: array([2012-10-08, 2012-10-10], dtype=object)
    

    或使用Timestamp.date 方法:

    In [127]: df["Date"].map(pd.Timestamp.date).unique()
    Out[127]: array([2012-10-08, 2012-10-10], dtype=object)
    

    【讨论】:

    • 谢谢,还有一个问题,如果我将 Date 列设为索引,df.index.map(pd.Timestamp.date).unique() 会抛出 'numpy.ndarray' object has no attribute 'unique' 错误
    • @tesla1060:您可以将其推回Series,使用pd.Series(df.index).map etc。或者如果顺序无关紧要,即使set(df.index.map(pd.Timestamp.date)) 也应该可以。
    • 请注意,.unique() 会默默地将值类型更改为 'numpy.datetime64'。
    • 列表理解更快。约 2000 个日期的示例:%timeit df.index.map(pd.Timestamp.date).unique() 给出 53.7 毫秒,而 %timeit pd.Series([d.date() for d in df.index]).unique() 给出 4.9 毫秒跨度>
    【解决方案2】:

    使用正则表达式:

    (\d{4}-\d{2}-\d{2})
    

    使用re.findall 函数运行它以获取所有匹配项:

    result = re.findall(r"(\d{4}-\d{2}-\d{2})", subject)
    

    【讨论】:

      【解决方案3】:

      只是给@DSM 一个替代答案,看看@Psidom 的other answer

      应该是这样的:

      pd.to_datetime(df['DateTime']).dt.date.unique()
      

      在我看来,它的表现稍微好一点

      【讨论】:

      • 作为使您的答案更完整的一种方式,请添加显示性能改进的输出。
      【解决方案4】:

      这是我在 Python 3.6.8 和 Pandas 1.1.5 上得到的:

      %timeit df['date'].map(lambda d: d.date()).unique()
      
      2.06 ms ± 135 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
      
      %timeit df['date'].dt.date.unique()
      
      535 µs ± 79.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
      
      %timeit df['date'].dt.normalize().unique()
      
      1.33 ms ± 229 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
      

      normalize().unique()的输出:

      array(['2021-04-08T00:00:00.000000000', '2021-04-07T00:00:00.000000000',
             '2021-04-06T00:00:00.000000000', '2021-04-05T00:00:00.000000000',
             '2021-04-04T00:00:00.000000000', '2021-04-03T00:00:00.000000000',
             '2021-04-02T00:00:00.000000000', '2021-04-01T00:00:00.000000000',
             ..., dtype='datetime64[ns]')
      

      相对于其他 2 个的输出:

      array([datetime.date(2021, 4, 8), datetime.date(2021, 4, 7),
             datetime.date(2021, 4, 6), datetime.date(2021, 4, 5),
             datetime.date(2021, 4, 4), datetime.date(2021, 4, 3),
             datetime.date(2021, 4, 2), datetime.date(2021, 4, 1),
             datetime.date(2021, 3, 31), datetime.date(2021, 3, 30),
             ..., dtype=object)
      

      【讨论】:

        猜你喜欢
        • 2020-06-27
        • 1970-01-01
        • 2021-03-04
        • 2023-03-15
        • 2017-02-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-17
        相关资源
        最近更新 更多