【问题标题】:converting a string to np.array with datetime64, NOT using Pandas使用 datetime64 将字符串转换为 np.array,而不是使用 Pandas
【发布时间】:2019-08-21 18:52:13
【问题描述】:

我正在寻找一种将 YYYYmmdd 格式给出的日期转换为 dtype='datetime64' 的 np.array 的方法。日期存储在另一个 np.array 中,但 dtype='float64'。

我正在寻找一种通过避免使用 Pandas 来实现这一目标的方法!

我已经尝试过类似answer 中建议的方法,但作者指出“[...] 如果(日期格式)在 ISO 8601 中,您可以使用 numpy 直接解析它,[...]” .

由于在我的情况下日期格式是 YYYYmmdd,它是(?) ISO 8601,所以应该可以使用 numpy 直接解析它。但我不知道如何,因为我是 python 和一般编码的初学者。

我真的尽量避免使用 Pandas,因为当有办法通过使用我已经在使用的模块完成任务时,我不想让我的脚本变得臃肿。我还读到它会降低速度here

【问题讨论】:

    标签: python python-3.x numpy datetime datetime-format


    【解决方案1】:

    如果没有其他人想出更多内置的东西,这里是一个普通的方法:

    >>> dates
    array([19700101., 19700102., 19700103., 19700104., 19700105., 19700106.,
           19700107., 19700108., 19700109., 19700110., 19700111., 19700112.,
           19700113., 19700114.])
    >>> y, m, d = dates.astype(int) // np.c_[[10000, 100, 1]] % np.c_[[10000, 100, 100]]
    >>> y.astype('U4').astype('M8') + (m-1).astype('m8[M]') + (d-1).astype('m8[D]')
    array(['1970-01-01', '1970-01-02', '1970-01-03', '1970-01-04',
           '1970-01-05', '1970-01-06', '1970-01-07', '1970-01-08',
           '1970-01-09', '1970-01-10', '1970-01-11', '1970-01-12',
           '1970-01-13', '1970-01-14'], dtype='datetime64[D]')
    

    【讨论】:

    • 谢谢。您能否解释一下最后两行,因为我不熟悉dates.astype(int) 之后的任何内容?
    • @zorrolo np.c_[] 可用于创建列向量;这里的效果是,由于广播地板除法的结果// 是可以在日期和10000, 100, 1 之间形成的每一对的完整表。因此,我们得到了三份日期副本,一份删除了最后 4 位数字,一份删除了最后两位数字,一份未更改。 % 在这里是模数,它从左边删除除 4 位以外的所有数字(在这个地方是一个 nop),除 2 位之外的所有数字都删除两次。因此,我们将在变量 y, m, d 中分别包含年、月和日。
    • ... 接下来我们先将年份转换为 unicode,然后再转换为 datetime64。并添加转换为 timedelta64 的月份和日期。
    • 太棒了!是否还对这些程序进行了修改以查找例如三月中的每个日期而忽略年份和日期?我一直在寻找一种方法来过滤几个月的日期数组,但在 np.datetime64 函数中找不到任何构建方法。
    • @zorrolo 这似乎有效:a[(a.astype('M8[M]') - a.astype('M8[Y]')).view(int) == 2]
    【解决方案2】:

    您可以通过 python 日期时间模块。

    from datetime import datetime
    import numpy as np
    
    datestrings = np.array(["18930201", "19840404"])
    dtarray = np.array([datetime.strptime(d, "%Y%m%d") for d in datestrings], dtype="datetime64[D]")
    print(dtarray)
    
    # out: ['1893-02-01' '1984-04-04'] datetime64[D]
    

    由于真正的问题seems to be如何将给定的字符串转换为matplotlib日期时间格式,

    from datetime import datetime
    import numpy as np
    from matplotlib import dates as mdates
    
    datestrings = np.array(["18930201", "19840404"])
    mpldates = mdates.datestr2num(datestrings)
    print(mpldates)
    
    # out: [691071. 724370.]
    

    【讨论】:

    • 我必须解释说我正在处理许多日期,比如 40k,因为每天测量大约 125 年。据我了解 python 在我描述的情况下使用 numpy 数组更快。我担心将日期存储为datetime64。几天前,我尝试了datestr2num(),但相关的绘图并没有以方便的格式显示 x 轴上的日期。所以我切换回对我有用的东西,因为我的时间不多了。
    • 确实,如果您使用上面的mpldates,您需要自己在轴上设置定位器和格式化程序。关于速度,您想通过不使用 pandas 来节省几毫秒的时间,同时尝试在屏幕上绘制 40k 数据,这有点自相矛盾。图形输出始终是瓶颈。还要考虑一下,人们可能已经花时间试图避免将 pandas 用于学习 pandas。例如。您可以使用 pandas 将 40k 数据子采样到一个较小的数据集中,这在绘图时要快得多。
    • 哦,情节不是程序的主要功能!许多计算都是提前完成的,其中 numpy 和一些 scipy 绝对令人满意。因此,重写整个脚本以使其与 pandas 一起工作是无稽之谈。但感谢您提供更多信息。
    猜你喜欢
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 2018-07-08
    • 2018-09-05
    • 2014-07-25
    • 1970-01-01
    相关资源
    最近更新 更多