我有一个带有两个y轴的情节,使用twinx()
.我也给线条贴了标签,并希望用它们来展示legend()
,但我只是成功地在图例中获得了一个轴的标签:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc
rc('mathtext', default='regular')
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(time, Swdown, '-', label = 'Swdown')
ax.plot(time, Rn, '-', label = 'Rn')
ax2 = ax.twinx()
ax2.plot(time, temp, '-r', label = 'temp')
ax.legend(loc=0)
ax.grid()
ax.set_xlabel("Time (h)")
ax.set_ylabel(r"Radiation ($MJ\,m^{-2}\,d^{-1}$)")
ax2.set_ylabel(r"Temperature ($^\circ$C)")
ax2.set_ylim(0, 35)
ax.set_ylim(-20,100)
plt.show()
Run Code Online (Sandbox Code Playgroud)
所以我只得到图例中第一个轴的标签,而不是第二个轴的标签"temp".我怎么能将这第三个标签添加到图例中?
您可以使用该功能tz_localize
来创建一个时间戳或DateTimeIndex时区知道,但你怎么能反其道而行之:你怎么能转换时区了解时间戳天真的一个,同时保持其时区?
一个例子:
In [82]: t = pd.date_range(start="2013-05-18 12:00:00", periods=10, freq='s', tz="Europe/Brussels")
In [83]: t
Out[83]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-05-18 12:00:00, ..., 2013-05-18 12:00:09]
Length: 10, Freq: S, Timezone: Europe/Brussels
Run Code Online (Sandbox Code Playgroud)
我可以通过将时区设置为None来删除时区,但结果将转换为UTC(12点钟变为10):
In [86]: t.tz = None
In [87]: t
Out[87]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-05-18 10:00:00, ..., 2013-05-18 10:00:09]
Length: 10, Freq: S, Timezone: None
Run Code Online (Sandbox Code Playgroud)
有没有另一种方法我可以将DateTimeIndex转换为时区naive,但保留时区设置为?
关于我问这个问题的一些背景:我想使用timezone天真的时间序列(为了避免时区的额外麻烦,我不需要它们用于我正在处理的情况).
但出于某种原因,我必须在当地时区(欧洲/布鲁塞尔)处理时区感知的时间序列.正如我的所有其他数据时区天真(但在我的本地时区代表),我想这个时间序列转化为天真的进一步工作与它,但它也有在我的本地时区来表示(所以刚取出时区信息,不将用户可见时间转换为UTC).
我知道时间实际上是内部存储为UTC,并且只有当你表示它时才转换为另一个时区,因此当我想要"离域化"时必须进行某种转换.例如,使用python datetime模块,您可以像这样"删除"时区:
In [119]: d = pd.Timestamp("2013-05-18 12:00:00", tz="Europe/Brussels")
In [120]: d
Out[120]: <Timestamp: 2013-05-18 12:00:00+0200 CEST, tz=Europe/Brussels>
In [121]: …
Run Code Online (Sandbox Code Playgroud) 我在熊猫中创建了一个TimeSeries:
In [346]: from datetime import datetime
In [347]: dates = [datetime(2011, 1, 2), datetime(2011, 1, 5), datetime(2011, 1, 7),
.....: datetime(2011, 1, 8), datetime(2011, 1, 10), datetime(2011, 1, 12)]
In [348]: ts = Series(np.random.randn(6), index=dates)
In [349]: ts
Out[349]:
2011-01-02 0.690002
2011-01-05 1.001543
2011-01-07 -0.503087
2011-01-08 -0.622274
2011-01-10 -0.921169
2011-01-12 -0.726213
Run Code Online (Sandbox Code Playgroud)
我正在关注"Python for Data Analysis"一书中的示例.
在以下段落中,作者检查索引类型:
In [353]: ts.index.dtype
Out[353]: dtype('datetime64[ns]')
Run Code Online (Sandbox Code Playgroud)
当我在控制台中执行完全相同的操作时,我得到:
ts.index.dtype
dtype('<M8[ns]')
Run Code Online (Sandbox Code Playgroud)
什么是两种类型之间的区别'datetime64[ns]'
和'<M8[ns]'
?
为什么我会得到另一种类型?
我认为答案非常明显,但我现在还没有看到.
如何将记录数组转换回常规ndarray?
假设我有以下简单的结构化数组:
x = np.array([(1.0, 4.0,), (2.0, -1.0)], dtype=[('f0', '<f8'), ('f1', '<f8')])
Run Code Online (Sandbox Code Playgroud)
然后我想将其转换为:
array([[ 1., 4.],
[ 2., -1.]])
Run Code Online (Sandbox Code Playgroud)
我试过asarray
和astype
,但没有奏效.
UPDATE(求解:float32(f4)而不是float64(f8))
好的,我尝试了Robert(x.view(np.float64).reshape(x.shape + (-1,))
)的解决方案,并且使用简单的数组它可以完美地工作.但是对于我想要转换的数组,它给出了一个奇怪的结果:
data = np.array([ (0.014793682843446732, 0.006681123282760382, 0.0, 0.0, 0.0, 0.0008984912419691682, 0.0, 0.013475529849529266, 0.0, 0.0),
(0.014793682843446732, 0.006681123282760382, 0.0, 0.0, 0.0, 0.0008984912419691682, 0.0, 0.013475529849529266, 0.0, 0.0),
(0.014776384457945824, 0.006656022742390633, 0.0, 0.0, 0.0, 0.0008901208057068288, 0.0, 0.013350814580917358, 0.0, 0.0),
(0.011928378604352474, 0.002819152781739831, 0.0, 0.0, 0.0, 0.0012627150863409042, 0.0, 0.018906937912106514, 0.0, 0.0),
(0.011928378604352474, 0.002819152781739831, 0.0, 0.0, 0.0, 0.001259754877537489, …
Run Code Online (Sandbox Code Playgroud) 我试图读取一个csv文件,numpy.genfromtxt
但有些字段是包含逗号的字符串.字符串是引号,但是numpy没有将引号识别为定义单个字符串.例如,使用't.csv'中的数据:
2012, "Louisville KY", 3.5
2011, "Lexington, KY", 4.0
Run Code Online (Sandbox Code Playgroud)
代码
np.genfromtxt('t.csv', delimiter=',')
Run Code Online (Sandbox Code Playgroud)
产生错误:
ValueError:检测到一些错误!第2行(有4列而不是3列)
我正在寻找的数据结构是:
array([['2012', 'Louisville KY', '3.5'],
['2011', 'Lexington, KY', '4.0']],
dtype='|S13')
Run Code Online (Sandbox Code Playgroud)
查看文档,我没有看到任何处理此问题的选项.有没有办法用numpy做,或者我只需要用csv
模块读取数据然后将其转换为numpy数组?
当我尝试绘制一个带有日期时间的pandas DataFrame列的切片时,我得到了一个KeyError.有人知道是什么原因引起的吗?
我设法在一个小的自包含示例中重现错误(您也可以在此处查看:http://nbviewer.ipython.org/3714142/):
import numpy as np
from pandas import DataFrame
import datetime
from pylab import *
test = DataFrame({'x' : [datetime.datetime(2012,9,10) + datetime.timedelta(n) for n in range(10)],
'y' : range(10)})
Run Code Online (Sandbox Code Playgroud)
现在,如果我绘图:
plot(test['x'][0:5])
Run Code Online (Sandbox Code Playgroud)
没有问题,但是当我绘制时:
plot(test['x'][5:10])
Run Code Online (Sandbox Code Playgroud)
我得到下面的KeyError(错误消息对我来说不是很有帮助).这仅发生日期时间列,不能与其他列(据我所经历).例如,plot(test['y'][5:10])
这不是问题.
Ther错误消息:
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-7-aa076e3fc4e0> in <module>()
----> 1 plot(test['x'][5:10])
C:\Python27\lib\site-packages\matplotlib\pyplot.pyc in plot(*args, **kwargs)
2456 ax.hold(hold)
2457 try:
-> 2458 ret = ax.plot(*args, **kwargs)
2459 draw_if_interactive()
2460 finally:
C:\Python27\lib\site-packages\matplotlib\axes.pyc in plot(self, *args, …
Run Code Online (Sandbox Code Playgroud) 我正在使用Pandas的to_sql
函数写入MySQL,由于帧大(1M行,20列)而导致超时.
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html
有没有更正式的方法来分块数据并在块中写行?我编写了自己的代码,这似乎有用.我更喜欢官方解决方案.谢谢!
def write_to_db(engine, frame, table_name, chunk_size):
start_index = 0
end_index = chunk_size if chunk_size < len(frame) else len(frame)
frame = frame.where(pd.notnull(frame), None)
if_exists_param = 'replace'
while start_index != end_index:
print "Writing rows %s through %s" % (start_index, end_index)
frame.iloc[start_index:end_index, :].to_sql(con=engine, name=table_name, if_exists=if_exists_param)
if_exists_param = 'append'
start_index = min(start_index + chunk_size, len(frame))
end_index = min(end_index + chunk_size, len(frame))
engine = sqlalchemy.create_engine('mysql://...') #database details omited
write_to_db(engine, frame, 'retail_pendingcustomers', 20000)
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用模式限定表将pandas DataFrame写入PostgreSQL数据库.
我使用以下代码:
import pandas.io.sql as psql
from sqlalchemy import create_engine
engine = create_engine(r'postgresql://some:user@host/db')
c = engine.connect()
conn = c.connection
df = psql.read_sql("SELECT * FROM xxx", con=conn)
df.to_sql('a_schema.test', engine)
conn.close()
Run Code Online (Sandbox Code Playgroud)
发生的事情是,pandas在名为"a_schema.test"的表中的模式"public"中写入,而不是在"a_schema"模式的"test"表中写入.
如何指示pandas使用不同于public的模式?
谢谢
我知道关于这个主题已经存在一个问题(将一个字段添加到结构化numpy数组中的最简洁方法),请参阅
但我对那里给出的答案有疑问......
如果您正在使用numpy 1.3,那么还有numpy.lib.recfunctions.append_fields()
我仍然有numpy 1.3,但它不识别这个功能,我也没有在numpy的文档中找到任何关于它的东西.这个功能怎么了?还有其他功能可以做同样的事情吗?
在进行一些分析时,我偶然发现了一个ValueError,我可以将其归结为以下简单示例,它可以重现我得到的错误:
import numpy as np
import matplotlib.pyplot as plt
import datetime as dt
x = np.array([dt.datetime(2012, 10, 19, 10, 0, 0),
dt.datetime(2012, 10, 19, 10, 0, 1),
dt.datetime(2012, 10, 19, 10, 0, 2),
dt.datetime(2012, 10, 19, 10, 0, 3)])
y = np.array([1, 3, 4, 2])
Run Code Online (Sandbox Code Playgroud)
当试图绘制这个简单的x和y数组时,我没有遇到任何问题:
fig, ax = plt.subplots()
ax.plot(x, y)
Run Code Online (Sandbox Code Playgroud)
要么
fig, (ax1, ax2) = plt.subplots(nrows=2)
ax1.plot(x, y)
Run Code Online (Sandbox Code Playgroud)
但是在添加时sharex=True
,我收到一个错误:
fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)
ax1.plot(x, y)
Run Code Online (Sandbox Code Playgroud)
错误消息:
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\matplotlib\backend_bases.py", line …
Run Code Online (Sandbox Code Playgroud) python ×10
numpy ×6
pandas ×6
matplotlib ×3
recarray ×2
sql ×2
sqlalchemy ×2
axis ×1
datetime64 ×1
genfromtxt ×1
legend ×1
mysql ×1
postgresql ×1