我有以下 df:
date time
2018-01-01 00:00:00 7:30:33
2017-01-01 00:00:00 7:30:33
Run Code Online (Sandbox Code Playgroud)
我想创建一个日期时间列,应如下所示:
2018-01-01 7:30:33
2017-01-01 7:30:33
Run Code Online (Sandbox Code Playgroud)
为此,我使用以下代码:
df["datetime"] = pd.to_datetime(df['date'].apply(str)+' '+df['time'])
Run Code Online (Sandbox Code Playgroud)
它在大多数时间都有效。但是,在我的 df 的某些部分(我不知道是哪些部分),我收到以下错误:
ValueError: hour must be in 0..23
Run Code Online (Sandbox Code Playgroud)
我做错了什么以及如何解决这个问题?
我有以下数据帧:
date id cars
2012 1 4
2013 1 6
2014 1 NaN
2012 2 10
2013 2 20
2014 2 NaN
Run Code Online (Sandbox Code Playgroud)
现在,我希望得到多年来汽车的平均值,因为每个id都忽略了NaN的.结果应该是这样的:
date id cars result
2012 1 4 5
2013 1 6 5
2014 1 NaN 5
2012 2 10 15
2013 2 20 15
2014 2 NaN 15
Run Code Online (Sandbox Code Playgroud)
我有以下命令:
df["result"]=df.groupby("id")["cars"].mean()
Run Code Online (Sandbox Code Playgroud)
该命令运行没有错误,但结果列只有NaN.我做错了什么?
我想循环遍历一个只有工作日的日期范围,即没有周末。为此,我使用以下命令,基本上选取一个月中的每个第三个星期五,并使列窗口等于从第三个星期五开始的 2、20 天。这段代码工作得很好。
for beg in pd.bdate_range("2000-01-01", "2017-05-01"):
beg= third_friday
df["window"].loc[beg: beg + pd.to_timedelta(20,"D")] = 2
if month==12:
year=year+1
month=0
if year>=2017 and month>=3:
break
month = month +3
monthcal = c.monthdatescalendar(year,month)
third_friday = [day for week in monthcal for day in week if \
day.weekday() == calendar.FRIDAY and \
day.month == month][2]
Run Code Online (Sandbox Code Playgroud)
然而,20 中
df["window"].loc[beg: beg + pd.to_timedelta(20,"D")] = 2
Run Code Online (Sandbox Code Playgroud)
命令指的是 20 天,包括周末,但我希望它指的是 20 个工作日;例如这样的东西:
df["window"].loc[beg: beg + pd.to_timedelta(20, "Weekdays_only")] = 2
Run Code Online (Sandbox Code Playgroud)
是否有一个简单的修复方法,以便我可以用其他内容替换“D”,或者我是否必须重写所有内容?
此外,我还想用不同的值标记第三个星期五周围的日子,例如third_friday之后的day +1是1,day+2是2。为此,我编写了第二个for循环。这里是完整的例子:
for beg in pd.bdate_range("2000-01-01", …Run Code Online (Sandbox Code Playgroud) 我有以下数据框
2001-01-01 2001-01-02 2001-01-03
1 0 8
Run Code Online (Sandbox Code Playgroud)
我想删除小于 2001-01-02 的每一列,即我的 df 应该是这样的:
2001-01-02 2001-01-03
0 8
Run Code Online (Sandbox Code Playgroud)
有人知道怎么做吗?
我有以下数据框:
id indicator
1 NaN
1 NaN
1 1
1 NaN
1 NaN
1 NaN
Run Code Online (Sandbox Code Playgroud)
实际上,我还有几个 id。我现在的问题是,如何对特定范围进行向前或向后填充,例如仅对下一个/最后 2 个观察进行填充。我的数据框应该是这样的:
id indicator
1 NaN
1 NaN
1 1
1 1
1 1
1 NaN
Run Code Online (Sandbox Code Playgroud)
我知道命令
df.groupby("id")["indicator"].fillna(value=None, method="ffill")
Run Code Online (Sandbox Code Playgroud)
但是,这会填充所有缺失值,而不仅仅是接下来的两个观察值。有谁知道解决方案?
我需要获得 df 的滚动第二大值。
为了获得最大的价值我所做的
max = df.sort_index(ascending=True).rolling(10).max()
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,python 抛出一个错误
max = df.sort_index(ascending=True).rolling(10).nlargest(2)
AttributeError: 'Rolling' object has no attribute 'nlargest'
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?我还能使用什么高性能的东西?
我之前曾与Stata合作,现在我正在尝试使用Python完成同样的工作.但是,我遇到了merge命令的麻烦.不知何故,我必须遗漏一些东西.我要合并的两个数据帧如下所示:
df1:
Date id Market_Cap
2000 1 400
2000 2 200
2001 1 410
2001 2 220
df2:
id Ticker
1 Shell
2 ExxonMobil
Run Code Online (Sandbox Code Playgroud)
我现在的目标是获得以下数据集:
Date id Market_Cap Ticker
2000 1 400 Shell
2000 2 200 ExxonMobil
2001 1 410 Shell
2001 2 220 ExxonMobil
Run Code Online (Sandbox Code Playgroud)
我尝试了以下命令:
merged= pd.merge(df1, df2, how="left", on="id")
Run Code Online (Sandbox Code Playgroud)
这会合并数据集,但在Ticker列中只给出了nan.我看了几个消息来源,也许我弄错了,但是对于我的目的来说,不是"左"命令是正确的做法吗?我也试过"正确"和"外在".他们没有得到我想要的结果,而"内在"似乎在这里似乎不起作用.
我错过了一些关键的东西吗
我有以下类型为 DatetimeIndex 的数据框,我想计算第一个值和最后一个值之间的天数。例如:在这个例子中我想要的结果是 365。
Date
2015-09-01 08:00:00
.
.
.
2016-09-01 08:00:00
Run Code Online (Sandbox Code Playgroud)
我试过
df.head(1)-df.tail(1)
Run Code Online (Sandbox Code Playgroud)
但这给了我错误:
AttributeError: 'DatetimeIndex' object has no attribute 'head'
Run Code Online (Sandbox Code Playgroud) 我在无限循环中运行我的 python 3.7 程序,当日志文件变得非常大时,日志记录会消耗大量的 cpu 功率。因此,我希望我的日志只是打印到控制台而不是写入文件。我知道我可以使用打印来实现这一点,但我更喜欢记录。
这是我目前使用的:
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(name)-12s %(levelname)-8s %
(message)s',
datefmt='%m-%d %H:%M%S',
filename='mylogfile.log',
filemode='w')
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %
(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
logger = logging.getLogger('')
Run Code Online (Sandbox Code Playgroud)
然后我像这样使用该模块:
logger.error('error in X')
Run Code Online (Sandbox Code Playgroud)
有什么可以用来阻止日志记录模块写入文件吗?
我有一个包含 68 个键的字典,其中每个键都有一个包含 50 个值的列表。例如,我的字典如下,其中每个系列都有 50 个值,例如 value1、value2....
key1 : Series1
key2 : Series2
. : .
key50: Series50
Run Code Online (Sandbox Code Playgroud)
我现在想从字典中制作以下数据框:
key1 key2
value1 value1
. .
. .
value50 value 50
Run Code Online (Sandbox Code Playgroud)
我查看了其他线程并尝试了以下命令:
df= pd.DataFrame([dict])
Run Code Online (Sandbox Code Playgroud)
但是,这会产生:
key1 key2
Series1 Series2
Run Code Online (Sandbox Code Playgroud)
如何获取数据框中的值而不是系列。最后,我应该得到大小为 50*68 的数据帧。
我有以下数据框:
id number
1 13
1 13
1 NaN
1 NaN
2 11
2 11
2 11
2 NaN
Run Code Online (Sandbox Code Playgroud)
我想找到每个 id 的第一个非 NaN 值并将其标记为 1。结果应如下所示:
id number code
1 13 NaN
1 13 1
1 NaN NaN
1 NaN NaN
2 11 NaN
2 11 NaN
2 11 1
2 NaN NaN
Run Code Online (Sandbox Code Playgroud)
我尝试了以下命令,然后从那里开始:
df["test"] = df.groupby("id")["number"].first_valid_index()
Run Code Online (Sandbox Code Playgroud)
它给了我以下错误:无法访问“SeriesGroupBy”对象的可调用属性“first_valid_index”,请尝试使用“apply”方法
然后我尝试了这个:
df['test'] = df.groupby("id")['number'].apply(lambda x: x.first_valid_index())
Run Code Online (Sandbox Code Playgroud)
但这给了我一列 Nats ......
有人知道如何有效地解决问题吗?