具有scatter和LinearRegression的日期问题

Gre*_*reg 1 python date pandas

我有两个问题,我相信它们都被发布到日期格式.

我有一个日期和价值观的简历:

2012-01-03 00:00:00     95812    
2012-01-04 00:00:00    101265 
... 
2016-10-21 00:00:00     93594
Run Code Online (Sandbox Code Playgroud)

在我加载之后read_csv我试图用以下方法解析日期:

X.Dated = pd.to_datetime(X.Dated, format='%Y-%m-%d %H:%M:%S', errors='raise')
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
X = pd.read_csv('sales.csv', parse_dates=['Dated'], date_parser=dateparse)
Run Code Online (Sandbox Code Playgroud)

infer_datetime_format论点.

所有这些似乎都很好,因为当我打印出来时,日期看起来像:2012-01-03.

当我试图在图表上绘制数据时出现问题,这一行:

ax.scatter(X.Dated, X.Val, c='green', marker='.')
Run Code Online (Sandbox Code Playgroud)

给我一个错误:

TypeError: invalid type promotion
Run Code Online (Sandbox Code Playgroud)

此外,当我尝试使用LinearRegression()算法时,fit命令工作正常,但得分和预测给了我这个错误:

TypeError: Cannot cast array data from dtype('<M8[ns]') to dtype('float64') according to the rule 'safe'
Run Code Online (Sandbox Code Playgroud)

我尝试了很多东西来解决它,但没有运气.任何帮助,将不胜感激.

unu*_*tbu 6

ax.scatter(目前)不接受Pandas系列,但它可以接受Pandas时间戳列表(例如X['Dated'].tolist())或dtype的NumPy数组datetime64[ns](例如X['Dated'].values):

import pandas as pd
import matplotlib.pyplot as plt

X = pd.DataFrame({'Dated': [pd.Timestamp('2012-01-03 00:00:00'),
                            pd.Timestamp('2012-01-04 00:00:00'),
                            pd.Timestamp('2016-10-21 00:00:00')],
                  'Val': [95812, 101265, 93594]})

fig, ax = plt.subplots()
# ax.scatter(X['Dated'].tolist(), X['Val'], c='green', marker='.', s=200)
ax.scatter(X['Dated'].values, X['Val'], c='green', marker='.', s=200)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


在引擎盖下,ax.scatter方法调用

x = self.convert_xunits(x)
y = self.convert_yunits(y)
Run Code Online (Sandbox Code Playgroud)

处理类似日期的输入.convert_xunits将NumPy datetime64数组转换为Matplotlib datenums,但它将Pandas时间序列转换为NumPy datetime64数组.

因此,当Pandas时间序列作为输入传递时ax.scatter,代码在到达此行时最终失败:

offsets = np.dstack((x, y))
Run Code Online (Sandbox Code Playgroud)

np.dstack试图将其输入的dtypes推广到一个共同的dtype.如果x有dtype datetime64[ns]并且y有dtype float64,那么

TypeError: invalid type promotion
Run Code Online (Sandbox Code Playgroud)

因为没有与两者兼容的本机NumPy dtype而被提出.