【问题标题】:Iterate over a numpy array of dates迭代一个 numpy 日期数组
【发布时间】:2019-04-07 05:08:24
【问题描述】:

我正在尝试遍历从 Pandas 数据框中提取的一系列日期;示例如下。

下面的代码最初抛出了以下错误

TypeError: 'numpy.datetime64' 对象不可迭代

r1 = pd.read_sql("select * from myTable",conn)    
...

dates = np.sort(r1['date'].unique())       

for i, d in dates:

   z_d = z[z['date']==d]
   r1_d = r1[r1['date']==d]
...

谷歌搜索后,我尝试应用iditer numpy 方法,但这样做会出现以下错误:

TypeError: 迭代 0 维数组

 r1 = pd.read_sql("select * from myTable",conn)    
 ...

 dates = np.sort(r1['date'].unique())       

 for i, d in np.nditer(dates):

    z_d = z[z['date']==d]
    r1_d = r1[r1['date']==d]
 ...

如何修改它以遍历 dates 变量中包含的日期列表?

【问题讨论】:

  • 你可能想要for I, d in enumerate(dates) 或者只是for d in dates
  • nditer 在这里无法为您提供帮助 - 它使用起来更复杂,而且速度也不快。

标签: python python-3.x pandas numpy


【解决方案1】:

您的 for 循环有两个变量,因此它需要来自数组元素的两个输入。错误是因为它试图解析或迭代字符串。改成

for d in dates:

【讨论】:

    【解决方案2】:

    for d in dates 会将d 依次分配给每个日期; for i,d in dates 不起作用,因为您不能将单个日期值分配给两个变量(它基本上是在尝试执行 i,d = dates[0] 等)如果您还想要索引,Python 不会免费为您提供它的for 循环;您必须使用enumerate 函数将索引添加到每个项目,然后循环其结果:for i,d in enumerate(dates):。幸运的是,enumerate 返回了一个惰性迭代器,所以它很高效;它不会首先生成所有索引。但是你得到的输出和它一样,你可以用list(enumerate(dates))看到这个结果,它会返回类似[(0,'first-date'), (1, 'second-date'), ...]的东西。所以分配变成i, d = (0, 'first-date')等等,工作正常。

    【讨论】:

    • @[Mark Reed] 实际上,在发布后偶然发现了“for d in dates”作为一种解决方法……不过,使用 enumerate() 正是我想要的,谢谢。不过,我对在不使用 enumerate() 的情况下看到“for i, d in ...”的形式有一个模糊的记忆……我记错了还是在某些情况下这是默认行为?
    • 你确定是 Python 吗? for i,d in 语法或类似的语法适用于其他一些语言,我的意思是,如果列表的每个元素本身是一个列表或具有至少两个项目的元组,它也适用于 Python,但如果这些元组不是由enumerate 你不一定会得到i 中的实际索引...
    猜你喜欢
    • 1970-01-01
    • 2021-06-02
    • 2021-09-08
    • 1970-01-01
    • 2018-03-13
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    相关资源
    最近更新 更多