【问题标题】:ValueError: Length of values does not match length of index | calculating differences between datesValueError:值的长度与索引的长度不匹配 |计算日期之间的差异
【发布时间】:2018-02-27 02:13:55
【问题描述】:

我有一个大约 50 列的数据集/pandas df - 列是字符、数字和日期的混合。其中 5 列是日期,标记为 Meeting1-Meeting5,我正在尝试计算会议日期之间的天数。

我的 df 大致是这样的:

ID_number   Meeting1    Meeting2    Meeting3    Meeting4    Meeting5    Comments    …
123456789   2014-09-17  2015-04-22  2015-05-30   NaN         NaN         text text   …
987654321   2015-09-22  NaN         2016-02-20   NaN         NaN         text text   …
456789123   2016-10-22  2017-05-29  NaN          NaN         NaN         text text   …

在 SQL 中,我通常会使用 SELECT DATEDIFF(dd,Meeting1,Meeting2) AS diff_mt1_mt2 在 Python 中,我尝试过使用

from datetime import datetime
from datetime import date

df['diff_mt1_mt2'] = (df['Meeting2']-df['Meeting1'])

但是得到一个 ValueError: 值的长度与索引的长度不匹配(下面的完整错误)

在 Python 中是否有更简单/更好的方法来做到这一点?

完全错误:

ValueError                                Traceback (most recent call last)
<ipython-input-9-055085bc04d7> in <module>()
      3 from datetime import date
      4 
----> 5 df['diff_mt1_mt2'] = (df['Meeting2']-df['Meeting1']),

C:\Users\lmgagne\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\frame.py in __setitem__(self, key, value)
   2427         else:
   2428             # set column
-> 2429             self._set_item(key, value)
   2430 
   2431     def _setitem_slice(self, key, value):

C:\Users\lmgagne\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\frame.py in _set_item(self, key, value)
   2493 
   2494         self._ensure_valid_index(value)
-> 2495         value = self._sanitize_column(key, value)
   2496         NDFrame._set_item(self, key, value)
   2497 

C:\Users\lmgagne\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\frame.py in _sanitize_column(self, key, value, broadcast)
   2664 
   2665             # turn me into an ndarray
-> 2666             value = _sanitize_index(value, self.index, copy=False)
   2667             if not isinstance(value, (np.ndarray, Index)):
   2668                 if isinstance(value, list) and len(value) > 0:

C:\Users\lmgagne\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\series.py in _sanitize_index(data, index, copy)
   2877 
   2878     if len(data) != len(index):
-> 2879         raise ValueError('Length of values does not match length of ' 'index')
   2880 
   2881     if isinstance(data, PeriodIndex):

ValueError: Length of values does not match length of index

我正在使用:

Python 3.6.1 版和 Pandas 0.20.1 版

【问题讨论】:

  • 可以添加数据样本吗?因为它应该可以工作。
  • @jezrael 添加了一些数据

标签: python python-3.x pandas


【解决方案1】:

我认为您需要先将Meeting 列转换为datetimes,然后通过to_datetime 使用参数errors='coerce' 将非日期时间转换为NaT(日期时间的缺失值):

#filter columns
cols = df.columns[df.columns.str.startswith('Meeting')]
df[cols] = df[cols].apply(lambda x: pd.to_datetime(x, errors='coerce'))

df['diff_mt1_mt2'] = (df['Meeting2']-df['Meeting1'])

【讨论】:

  • 添加了这段代码,但仍然产生同样的错误
  • 没有数据很难回答。但也许使用旧版本的熊猫。
【解决方案2】:
import pandas as pd
import numpy as np

d1 = pd.to_datetime(['2014-09-17','2015-04-22','2015-05-30',np.NaN,np.NaN])
d2= pd.to_datetime(['2015-09-22',np.NaN,'2016-02-20',np.NaN,np.NaN])
d3= pd.to_datetime(['2016-10-22','2017-05-29',np.NaN,np.NaN,np.NaN])
data=[d1,d2,d3]
index_serie = np.array((123456789,987654321,456789123))

df = pd.DataFrame(data=data,index=index_serie,columns=['Meeting 1','Meeting 2','Meeting 3','Meeting 4','Meeting 5'])
df.index.name = 'ID_number'
df['diff_mt1_mt2'] = (df['Meeting 2']-df['Meeting 1'])

最新版本的 Python 和 Pandas 对我来说效果很好。

【讨论】:

    猜你喜欢
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多