小编fre*_*888的帖子

合并日期和时间;ValueError:小时必须在 0..23 内

我有以下 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)

我做错了什么以及如何解决这个问题?

python datetime pandas

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

pandas groupby是指nan

我有以下数据帧:

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.我做错了什么?

python mean dataframe pandas pandas-groupby

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

pandas:to_timedelta 与工作日

我想循环遍历一个只有工作日的日期范围,即没有周末。为此,我使用以下命令,基本上选取一个月中的每个第三个星期五,并使列窗口等于从第三个星期五开始的 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)

python datetime timedelta pandas

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

根据熊猫中的 if 条件删除数据框列

我有以下数据框

 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)

有人知道怎么做吗?

python pandas

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

pandas ffill/bfill 用于特定观察量

我有以下数据框:

 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)

但是,这会填充所有缺失值,而不仅仅是接下来的两个观察值。有谁知道解决方案?

python pandas

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

熊猫:滚动第二大价值

我需要获得 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)

这是一个错误吗?我还能使用什么高性能的东西?

python pandas rolling-computation

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

在Pandas中合并两个数据集

我之前曾与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.我看了几个消息来源,也许我弄错了,但是对于我的目的来说,不是"左"命令是正确的做法吗?我也试过"正确"和"外在".他们没有得到我想要的结果,而"内在"似乎在这里似乎不起作用.

我错过了一些关键的东西吗

python merge pandas

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

DateTime 系列中第一个和最后一个值之间的天数差异

我有以下类型为 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)

date pandas

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

Python 仅记录到控制台而不记录到文件

我在无限循环中运行我的 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)

有什么可以用来阻止日志记录模块写入文件吗?

python logging

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

从系列字典创建熊猫数据框

我有一个包含 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 的数据帧。

python dictionary dataframe pandas

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

Python:Groupby 第一个非 NaN 值

我有以下数据框:

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 ......

有人知道如何有效地解决问题吗?

python pandas

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