小编Fre*_*d S的帖子

将Matlab的datenum格式转换为Python

我刚开始从Matlab迁移到Python 2.7,我在阅读我的.mat文件时遇到了一些麻烦.时间信息以Matlab的datenum格式存储.对于那些不熟悉它的人:

序列日期编号表示日历日期,作为自固定基准日期以来经过的天数.在MATLAB中,序列号1是1月1日0000.

MATLAB还使用连续时间来表示从午夜开始的几天的分数; 例如,下午6点等于0.75连续日.所以MATLAB中的字符串'31 -Oct-2003,6:00 PM'是日期号731885.75.

(取自Matlab文档)

我想将其转换为Pythons时间格式,我找到了本教程.简而言之,作者说明了这一点

如果你使用python解析它,datetime.fromordinal(731965.04835648148)那么结果可能看起来合理[...]

(在任何进一步的转换之前),这对我不起作用,因为datetime.fromordinal需要一个整数:

>>> datetime.fromordinal(731965.04835648148) 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: integer argument expected, got float
Run Code Online (Sandbox Code Playgroud)

虽然我可以将它们整理成日常数据,但实际上我需要输入精确的时间序列.有没有人有这个问题的解决方案?我想避免重新格式化我的.mat文件,因为它们有很多,我的同事也需要使用它们.

如果它有所帮助,其他人则要求反过来.可悲的是,我对Python太新了,无法真正理解那里发生的事情.

/ edit(2012-11-01):这已在上面发布的教程中修复.

python matlab

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

如何按中位数对熊猫的箱线图进行排序?

我想按类别和Z数据在数据框中绘制一个列的方框图.如何按中位数按降序对箱线图进行排序?dfXY

import pandas as pd
import random
n = 100
# this is probably a strange way to generate random data; please feel free to correct it
df = pd.DataFrame({"X": [random.choice(["A","B","C"]) for i in range(n)], 
                   "Y": [random.choice(["a","b","c"]) for i in range(n)],
                   "Z": [random.gauss(0,1) for i in range(n)]})
df.boxplot(column="Z", by=["X", "Y"])
Run Code Online (Sandbox Code Playgroud)

请注意,这个问题非常相似,但它们使用不同的数据结构.我对pandas比较陌生(并且一般只在python上做了一些教程),所以我无法弄清楚如何使我的数据与那里发布的答案一起工作.这可能更像是重塑而不是绘图问题.也许有一个解决方案使用groupby

python boxplot pandas

13
推荐指数
3
解决办法
8794
查看次数

熊猫时间序列箱图

如何为大熊猫时间序列创建一个箱形图,我每天都有一个盒子?

每小时数据的样本数据集,其中一个框应包含24个值:

import pandas as pd
n = 480
ts = pd.Series(randn(n),
               index=pd.date_range(start="2014-02-01",
                                   periods=n,
                                   freq="H"))
ts.plot()
Run Code Online (Sandbox Code Playgroud)

我知道我可以为当天制作一个额外的列,但我希望有适当的x轴标记和x限制功能(如in ts.plot()),因此能够使用日期时间索引会很棒.

没有为R/GGPLOT2类似的问题在这里,如果它有助于澄清我想要的东西.

python time-series boxplot pandas

10
推荐指数
2
解决办法
9698
查看次数

熊猫DataFrame的多列并排的boxplot

一年的样本数据:

import pandas as pd
import numpy.random as rnd
import seaborn as sns
n = 365
df = pd.DataFrame(data = {"A":rnd.randn(n), "B":rnd.randn(n)+1},
                  index=pd.date_range(start="2017-01-01", periods=n, freq="D"))
Run Code Online (Sandbox Code Playgroud)

我想将这些数据并排分组,按月分组(即每月两个盒子,一个盒子A和一个盒子B).对于单个列sns.boxplot(df.index.month, df["A"])工作正常.但是,sns.boxplot(df.index.month, df[["A", "B"]])抛出一个错误(ValueError: cannot copy sequence with size 2 to array axis with dimension 365).通过index(pd.melt(df, id_vars=df.index, value_vars=["A", "B"], var_name="column"))熔化数据以使用seaborn的hue属性作为变通方法也不起作用(TypeError: unhashable type: 'DatetimeIndex').

(如果使用普通的matplotlib更容易,解决方案不一定需要使用seaborn.)

/编辑:我找到了一个基本上可以产生我想要的解决方法.但是,一旦DataFrame包含的变量多于我想绘制的变量,就会变得有些尴尬.所以,如果有更优雅/直接的方式,请分享!

df_stacked = df.stack().reset_index()
df_stacked.columns = ["date", "vars", "vals"]
df_stacked.index = df_stacked["date"]
sns.boxplot(x=df_stacked.index.month, y="vals", hue="vars", …
Run Code Online (Sandbox Code Playgroud)

python plot boxplot pandas seaborn

10
推荐指数
2
解决办法
4384
查看次数

Pandas Dataframe - 在多列上装箱并获取另一列的统计信息

问题

我有一个目标变量x和一些额外的变量AB. 我想计算满足和x某些条件时的平均值(和其他统计数据)。一个真实世界的例子是当太阳辐射 ( ) 和风速 ( ) 落入某些预定义的区间范围时,从一系列测量中计算平均气温 ( ) 。ABxAB

潜在的解决方案

我已经能够用循环来完成这个(见下面的例子),但我知道我应该避免在数据帧上循环。从我对这个网站的研究来看,我觉得使用pd.cut或可能有一个更优雅/矢量化的解决方案np.select,但坦率地说,我无法弄清楚如何去做。

例子

生成样本数据

import pandas as pd
import numpy as np

n = 100
df = pd.DataFrame(
    {
        "x": np.random.randn(n),
        "A": np.random.randn(n)+5,
        "B": np.random.randn(n)+10
    }
)
Run Code Online (Sandbox Code Playgroud)

df.head() 输出:

    x           A           B
0   -0.585313   6.038620    9.909762
1   0.412323    3.991826    8.836848
2   0.211713    5.019520    9.667349
3   0.710699    5.353677    9.757903
4   0.681418    4.452754 …
Run Code Online (Sandbox Code Playgroud)

python numpy binning pandas

10
推荐指数
2
解决办法
2814
查看次数

在matplotlib中单独设置xticklabels的颜色

如何在下面的例子中给出标签"a","b","c"个别颜色(例如"a"为绿色,"b"为蓝色,"c"为红色)?

import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
p = plt.boxplot(np.random.normal(size=(10,3)))
ax.set_xticklabels(list("abc"))
plt.show()
Run Code Online (Sandbox Code Playgroud)

没有单独着色标签的boxplot示例.

python matplotlib boxplot

8
推荐指数
1
解决办法
2791
查看次数

如何在Python中有效地生成具有随机斜率和截距的直线?

考虑一个非常基本的蒙特卡罗模拟直线y = m * x + b,例如,可视化参数m和不确定性的影响b.m并且b都是从正态分布中采样的.来自MATLAB背景,我会写这个

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(start=0, stop=5, step=0.1)

n_data = len(x)
n_rnd = 1000

m = np.random.normal(loc=1, scale=0.3, size=n_rnd) 
b = np.random.normal(loc=5, scale=0.3, size=n_rnd)

y = np.zeros((n_data, n_rnd))  # pre-allocate y

for realization in xrange(n_rnd):
    y[:,realization] = m[realization] * x + b[realization]

plt.plot(x, y, "k", alpha=0.05);
Run Code Online (Sandbox Code Playgroud)

蒙特卡罗模拟直线

这确实产生了所需的输出,但我觉得必须有一个更"Pythonic"的方式来做到这一点.我错了吗?如果没有,是否有人可以提供一些代码示例来说明如何更有效地执行此操作?

举一个例子我在寻找:在MATLAB中,这可以很容易地编写,而无需使用循环bsxfun().在Python中是否有类似的东西,或者甚至包含类似这些东西的包?

python random numpy montecarlo

8
推荐指数
1
解决办法
1706
查看次数

MATLAB:将当前文件夹设置为脚本的locaton

我在不同的文件夹中有一些脚本和数据,我addpath经常使用和相对路径.我的问题是,这仅在我当前文件夹所在的脚本所在的位置才有效.例如,如果我执行添加路径X的脚本A并且稍后执行位于路径X中的脚本B,则Matlab不会自动更改文件夹,并且脚本B中指定的相对路径不再起作用.

有没有办法自动将我当前的文件夹设置为我正在执行的脚本的位置?

/编辑:我应该注意,我在具有不同驱动器名称的不同计算机上使用这些脚本,因此使用绝对路径可能无济于事.

matlab path

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

用相邻天数的平均值填补数据空白

想象一下每 30 分钟测量一次包含多个变量的数据框。此数据框中的每个时间序列在可能不同的位置都有间隙。这些差距将被某种运行平均值取代,比如说 +/- 2 天。例如,如果在第 4 天 07:30 我缺少数据,我想NaN用第 2、3、5 和 6 天 07:30 的测量值的平均值替换一个条目。请注意,对于例如,第 5 天 07:30 也是NaN- 在这种情况下,这应该从替换第 4 天丢失的测量值的平均值中排除(应该可以用np.nanmean?)

我不知道该怎么做。现在,我可能会遍历数据框中的每一行和每一列,并沿着np.mean(df.ix[[i-48, i, i+48], "A"]).

样本数据集:

import numpy as np
import pandas as pd

# generate a 1-week time series
dates = pd.date_range(start="2014-01-01 00:00", end="2014-01-07 00:00", freq="30min")
df = pd.DataFrame(np.random.randn(len(dates),3), index=dates, columns=("A", "B", "C"))

# generate some artificial gaps
df.ix["2014-01-04 10:00":"2014-01-04 11:00", "A"] = np.nan
df.ix["2014-01-04 12:30":"2014-01-04 14:00", "B"] = …
Run Code Online (Sandbox Code Playgroud)

python time-series pandas

5
推荐指数
1
解决办法
2043
查看次数

熊猫中日期时间索引的算术运算

在熊猫中,您可以通过基于经典整数位置/行的索引或基于日期时间的索引来访问时间序列的特定位置。可以使用基本的算术运算来操纵基于整数的索引,例如,如果我有一个integer_index频率为12小时的时间序列,而我想在此日期的前一天正好访问该条目,则可以这样做integer_index - 2。但是,现实世界中的数据并不总是完美的,有时会丢失行。在这种情况下,此方法将失败,并且能够使用基于日期时间的索引并one day从该索引中减去该值将很有帮助。我怎样才能做到这一点?

示例脚本:

# generate a sample time series
import pandas as pd
s = pd.Series(["A", "B", "C", "D", "E"], index=pd.date_range("2000-01-01", periods=5, freq="12h"))
print s

2000-01-01 00:00:00    A
2000-01-01 12:00:00    B
2000-01-02 00:00:00    C
2000-01-02 12:00:00    D
2000-01-03 00:00:00    E
Freq: 12H, dtype: object

# these to indices should access the same value ("C")
integer_index = 2
date_index = "2000-01-02 00:00"

print s[integer_index]  # prints "C"
print s[date_index]  # prints "C"

# …
Run Code Online (Sandbox Code Playgroud)

python datetime pandas

5
推荐指数
1
解决办法
4911
查看次数

MATLAB:平均没有循环的时间序列数据?

我以30分钟的间隔测量了一些变量.时间戳有格式datevecdatenum格式.我想计算......

a)...每日平均值和
b)...... x在我的整个数据集上平均的时间平均值,例如11:30的温度,12点的温度等.

虽然这或多或少都可以通过循环轻松完成,但我想知道是否有更简单/更方便的方法来处理时间序列,因为这毕竟是一个非常基本的任务?

/编辑1:根据请求:点击我查看样本数据

matlab average time-series

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

MATLAB:更快地预分配零矩阵

/ edit:有关该主题的有趣讨论,请参阅此处.谢谢@Dan


使用a(m,n) = 0的似乎更快,这取决于基体的大小aa = zeros(m,n).在循环之前进行预分配时,两种变体是否相同?

matlab loops memory-management

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

将字符串添加到列表中的每个单独的字符串

简单地添加字符串和字符串列表会产生错误cannot concatenate 'str' and 'list' objects.是否有更优雅的方式来执行以下操作(例如,没有循环)?

list_of_strings = ["Hello", "World"]
string_to_add = "Foo"

for item, string in enumerate(list_of_strings):
    list_of_strings[item] = string_to_add + string

# list_of_strings is now ["FooHello", "FooWorld"]
Run Code Online (Sandbox Code Playgroud)

python string list

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