小编jor*_*ris的帖子

带有twinx()的辅助轴:如何添加到图例?

我有一个带有两个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".我怎么能将这第三个标签添加到图例中?

在此输入图像描述

python axis matplotlib legend

256
推荐指数
7
解决办法
18万
查看次数

将pandas timezone-aware DateTimeIndex转换为天真时间戳,但在某个时区

您可以使用该功能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)

python pandas

71
推荐指数
6
解决办法
6万
查看次数

数据类型'datetime64 [ns]'和'<M8 [ns]'之间的区别?

我在熊猫中创建了一个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]'

为什么我会得到另一种类型?

python numpy pandas datetime64

52
推荐指数
2
解决办法
5万
查看次数

将结构化数组转换为常规NumPy数组

我认为答案非常明显,但我现在还没有看到.

如何将记录数组转换回常规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)

我试过asarrayastype,但没有奏效.

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)

python numpy recarray

37
推荐指数
4
解决办法
2万
查看次数

使用numpy.genfromtxt读取包含逗号的字符串的csv文件

我试图读取一个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数组?

python numpy pandas genfromtxt

29
推荐指数
3
解决办法
4万
查看次数

使用日期时间绘制切片的pandas数据帧时的KeyError

当我尝试绘制一个带有日期时间的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)

python numpy matplotlib pandas

20
推荐指数
2
解决办法
1万
查看次数

Python Pandas - 使用to_sql以块的形式写入大数据帧

我正在使用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)

python mysql sql sqlalchemy pandas

15
推荐指数
2
解决办法
1万
查看次数

Pandas将数据帧写入其他postgresql架构

我正在尝试使用模式限定表将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的模式?

谢谢

python sql postgresql sqlalchemy pandas

15
推荐指数
1
解决办法
1万
查看次数

将字段添加到结构化numpy数组(2)

我知道关于这个主题已经存在一个问题(将一个字段添加到结构化numpy数组中的最简洁方法),请参阅

将字段添加到结构化的numpy数组中

但我对那里给出的答案有疑问......

如果您正在使用numpy 1.3,那么还有numpy.lib.recfunctions.append_fields()

我仍然有numpy 1.3,但它不识别这个功能,我也没有在numpy的文档中找到任何关于它的东西.这个功能怎么了?还有其他功能可以做同样的事情吗?

python numpy recarray

14
推荐指数
3
解决办法
1万
查看次数

使用sharex = True绘制日期会导致ValueError:ordinal必须> = 1

在进行一些分析时,我偶然发现了一个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 numpy matplotlib

13
推荐指数
1
解决办法
2万
查看次数