我刚开始从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):这已在上面发布的教程中修复.
我想按类别和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?
如何为大熊猫时间序列创建一个箱形图,我每天都有一个盒子?
每小时数据的样本数据集,其中一个框应包含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类似的问题在这里,如果它有助于澄清我想要的东西.
一年的样本数据:
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) 我有一个目标变量x和一些额外的变量A和B. 我想计算满足和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) 如何在下面的例子中给出标签"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)

考虑一个非常基本的蒙特卡罗模拟直线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中是否有类似的东西,或者甚至包含类似这些东西的包?
我在不同的文件夹中有一些脚本和数据,我addpath经常使用和相对路径.我的问题是,这仅在我当前文件夹所在的脚本所在的位置才有效.例如,如果我执行添加路径X的脚本A并且稍后执行位于路径X中的脚本B,则Matlab不会自动更改文件夹,并且脚本B中指定的相对路径不再起作用.
有没有办法自动将我当前的文件夹设置为我正在执行的脚本的位置?
/编辑:我应该注意,我在具有不同驱动器名称的不同计算机上使用这些脚本,因此使用绝对路径可能无济于事.
想象一下每 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) 在熊猫中,您可以通过基于经典整数位置/行的索引或基于日期时间的索引来访问时间序列的特定位置。可以使用基本的算术运算来操纵基于整数的索引,例如,如果我有一个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) 我以30分钟的间隔测量了一些变量.时间戳有格式datevec或datenum格式.我想计算......
a)...每日平均值和
b)...... x在我的整个数据集上平均的时间平均值,例如11:30的温度,12点的温度等.
虽然这或多或少都可以通过循环轻松完成,但我想知道是否有更简单/更方便的方法来处理时间序列,因为这毕竟是一个非常基本的任务?
/编辑1:根据请求:点击我查看样本数据
简单地添加字符串和字符串列表会产生错误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)