我正在构建一个数据框架:
datetoday = (pd.to_datetime(files[-1]['file_published'], format='%d.%m.%Y %H:%M')).strftime('%Y-%m-%d')
datetoday
Out[66]: '2022-11-23'
dates = pd.Series(np.arange(1, 337, 1))
dates
Out[68]:
0 1
1 2
2 3
3 4
4 5
...
331 332
332 333
333 334
334 335
335 336
Length: 336, dtype: int64
然后添加一个数据列:
data = pd.read_excel(files[0]['file_path'], sheet_name='Sheet1', engine='openpyxl').iloc[1:, 3:].astype(
float).dropna(axis=1).values.flatten()
len(data)
Out[73]: 336
但是当我创建最终的数据帧时:
df = pd.DataFrame({'datecreated': datetoday, 'timestamp': dates, 'ipto_weekly_forecast': data})
我得到以下错误:
ValueError: array length 0 does not match index length 336
奇怪的是,错误发生在木星上,但在PyCharm的本地df
得到构建没有问题。
我该如何解决这个问题?
猜想
您在Jupyter上使用的旧版本的pandas对您使用标量指定datecreated
列的方式很挑剔。值(注意,对于其他两列,您使用列表/数组指定) .
解决方案下面的修复将适用于任何版本的pandas(考虑到dates
和data
列表的长度实际上是336):
df = pd.DataFrame({
'datecreated': [datetoday]*336,
'timestamp': dates,
'ipto_weekly_forecast': data
})
下面是一个使用模拟数据的例子。
dates = pd.Series(np.arange(1, 337, 1))
data = pd.Series(np.arange(1, 337, 1))
datetoday = '2022-11-23'
df = pd.DataFrame({'datecreated': [datetoday]*336, 'timestamp': dates, 'ipto_weekly_forecast': data})
解决方案有效,因为表达式[datetoday]*336
的计算结果为长度为336的列表,每个值都等于datetoday
。现在,我们为pandas提供每列相同长度的数据。
注:我打算以更精简的格式提供这些信息作为评论,但我没有足够的声誉来评论。
标题>