GVKun编程网logo

在 Pandas DataFrame 中选择日期来计算夏令时(pandas日期函数)

10

本文将介绍在PandasDataFrame中选择日期来计算夏令时的详细情况,特别是关于pandas日期函数的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一

本文将介绍在 Pandas DataFrame 中选择日期来计算夏令时的详细情况,特别是关于pandas日期函数的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Pandas - 使用一个 Dataframe 列的子字符串比较两个 Dataframe、pandas dataframe 与 spark dataframe 互相转换(数据类型应该怎么转换呢?)、Pandas DataFrame 跨组计算平均值、Pandas DataFrame上特定于组的计算的知识。

本文目录一览:

在 Pandas DataFrame 中选择日期来计算夏令时(pandas日期函数)

在 Pandas DataFrame 中选择日期来计算夏令时(pandas日期函数)

如何解决在 Pandas DataFrame 中选择日期来计算夏令时?

我试图在 Pandas DataFrame 中选择一个日期范围(包含半小时数据)来确定那些天的夏令时。夏令时从 9 月的最后一个星期日开始,到 4 月的第一个星期日结束。

import numpy as np
import pandas as pd
from datetime import datetime,date,timedelta

...

df0 = df0.set_index(''datetime'')

df0[''mnth''] = pd.DatetimeIndex(df0.index).month
df0[''dow''] = pd.DatetimeIndex(df0.index).dayofweek # Mon=0,...,Sun=6

start_dst = df0.iloc[(df0.mnth==9) & (df0.dow==6).idxmax()]
end_dst = df0.iloc[(df0.mnth==4) & (df0.dow==6).idxmin()]
df0.index[start_dst:end_dst] = df0.index + pd.timedelta(''1h'')

我的数据在 9 月至 4 月期间基本上向后移动 1 小时,因此我需要在此期间向时间戳添加 1 小时。但是当我定义 start_dst 时,出现错误

TypeError: Cannot perform ''and_'' with a dtyped [bool] array and scalar of type [bool]

我不知道如何更改 start_dst

编辑:这是一个示例数据框:

# End DST: first Sunday of April,1h backward (5 Apr 2020)
# Start DST: last Sunday of September,1h forward (27 Sep 2020)
# 4,5,6 April 2020,26,27,28 Sep 2020
d1 = ''2020-04-04''
d2 = ''2020-04-05''
d3 = ''2020-04-06''
d4 = ''2020-09-26''
d5 = ''2020-09-27''
d6 = ''2020-09-28''

df1 = pd.DataFrame()
df1[''date''] = pd.to_datetime([d1]*24,format=''%Y-%m-%d'')
df1[''time''] = (pd.date_range(d1,periods=24,freq=''H'') - pd.timedelta(hours=1)).time
df1 = df1.set_index(''date'')

df2 = pd.DataFrame()
df2[''date''] = pd.to_datetime([d2]*25,format=''%Y-%m-%d'')
df2[''time''] = (pd.date_range(d2,periods=25,freq=''H'') - pd.timedelta(hours=1)).time
df2 = df2.set_index(''date'')

df3 = pd.DataFrame()
df3[''date''] = pd.to_datetime([d3]*24,format=''%Y-%m-%d'')
df3[''time''] = (pd.date_range(d3,freq=''H'')).time
df3 = df3.set_index(''date'')

df4 = pd.DataFrame()
df4[''date''] = pd.to_datetime([d4]*24,format=''%Y-%m-%d'')
df4[''time''] = (pd.date_range(d4,freq=''H'')).time
df4 = df4.set_index(''date'')

df5 = pd.DataFrame()
df5[''date''] = pd.to_datetime([d5]*23,format=''%Y-%m-%d'')
df5a = pd.DataFrame(pd.date_range(''00:00'',''01:59'',freq=''H'').time)
df5b = pd.DataFrame(pd.date_range(''01:00'',freq=''H'').time)
df5c = pd.DataFrame(pd.date_range(''03:00'',''22:00'',freq=''H'').time)
df5[''time''] = pd.concat([df5a,df5b,df5c],axis=0).values
df5 = df5.set_index(''date'')

df6 = pd.DataFrame()
df6[''date''] = pd.to_datetime([d6]*24,format=''%Y-%m-%d'')
df6[''time''] = (pd.date_range(d6,freq=''H'') - pd.timedelta(hours=1)).time
df6 = df6.set_index(''date'')

df0 = pd.DataFrame()
z = df1.append(df2).append(df3).append(df4).append(df5).append(df6)
df0[''datetime''] = pd.to_datetime(z.index.astype(str)+'' ''+z.time.astype(str),format=''%Y-%m-%d %H:%M:%s'')
df0 = df0.set_index(''datetime'')

df0[''mnth''] = pd.DatetimeIndex(df0.index).month
df0[''dow''] = pd.DatetimeIndex(df0.index).dayofweek # Mon=0,Sun=6
df0[''hour''] = pd.DatetimeIndex(df0.index).hour

解决方法

您可以创建/定义一个函数,通过计算条件为您提供索引:

def get_indexex():
    try:
        idxmx=df0.index==((df0[''dow'']==6).idxmax())
        idxmn=df0.index==((df0[''dow'']==6).idxmin())
        start_dst = df0.loc[(df0[''mnth'']==9) & idxmx]
        end_dst = df0.loc[(df0[''mnth'']==4) & idxmn]
        if not start_dst.index.tolist():
            return df0.loc[:end_dst.index[-1]].index
        elif not end_dst.index.tolist():
            return  df0.loc[start_dst.index[0]:].index
        else:
            return  df0.loc[start_dst.index[0]:end_dst.index[-1]].index
    except IndexError:
        start_dst=df0.loc[(df0[''dow''].eq(6) & df0[''mnth''].eq(9)) & df0[''hour''].eq(2)]
        end_dst=df0.loc[df0[''mnth''].eq(4) & df0[''hour''].eq(3)]
        if not start_dst.index.tolist():
            return df0.loc[:end_dst.index[-1]].index
        elif not end_dst.index.tolist():
            return  df0.loc[start_dst.index[0]:].index
        else:
            return  df0.loc[start_dst.index[0]:end_dst.index[-1]].index

最后:

df0[''dt'']=df0.index
m=df0.index.isin(get_indexex())
df0.loc[m,''dt'']=df0.loc[m,''dt'']+pd.Timedelta(''1H'')
df0.index=df0.pop(''dt'')

某些事情的原因:

  • 您无法更改子集的索引,因此为此我们创建了 ''dt'' 列并将该值设置为等于我们数据框的 index

  • 我们为 idxmax() 制作 idxmx 变量,为 idxmin() 制作 idxmn 变量,它们将 idxmax()idxmin() 的值与数据帧的 index 进行比较并为您提供一个布尔数组,您会收到错误,因为 (df0.dow==6).idxmax() or (df0.dow==6).idxmin() 为您提供了一个值而不是一系列布尔值

  • 我们正在定义一个名为 get_indexex() 的函数,当 start_dst 是一个空数据框时,它会为您提供条件满足的索引索引以处理这种情况

  • 在函数内部还有一件事要注意,如果 start_dst 和 end_dst 包含多个条目,我们将在这些情况下获取 start_dst 的第 0 个索引和 end_dst 的最后一个索引的索引

更新:

你从函数中得到 2020-04-05 23:00:00 因为你的条件满足所以 end_dst 和 start_dst 中的任何一个给你结果所以如果你不想要那么你从函数中删除这个案例所以现在它变成:

def get_indexex():
    start_dst=df0.loc[(df0[''dow''].eq(6) & df0[''mnth''].eq(9)) & df0[''hour''].eq(2)]
    end_dst=df0.loc[df0[''mnth''].eq(4) & df0[''hour''].eq(3)]
    if not start_dst.index.tolist():
        return df0.loc[:end_dst.index[-1]].index
    elif not end_dst.index.tolist():
        return  df0.loc[start_dst.index[0]:].index
    else:
        return  df0.loc[start_dst.index[0]:end_dst.index[-1]].index

最后:

df0[''dt'']=df0.index
m=df0.index.isin(get_indexex())
df0.loc[m,''dt'']+pd.Timedelta(''1H'')
df0.index=df0.pop(''dt'')
,

我相信错误是因为 idxmax() 和 idxmin();两者都返回索引号,并且该索引不是 bool 类型。 (df0.mnth==9) 和 (df0.mnth==4) 将返回一个 True 和 False 数组;当你尝试比较它们时,就会出现这个错误。

Pandas - 使用一个 Dataframe 列的子字符串比较两个 Dataframe

Pandas - 使用一个 Dataframe 列的子字符串比较两个 Dataframe

我能够使用下面的方法获得所需的输出

df1.merge(df2,left_on = df2.prod_ref.str.extract(''(\d+)'',expand = False),right_on = df1.prod_id.str.extract(''(\d+)'',how = ''left'')

pandas dataframe 与 spark dataframe 互相转换(数据类型应该怎么转换呢?)

pandas dataframe 与 spark dataframe 互相转换(数据类型应该怎么转换呢?)

文章大纲

  • spark 2.x 版本
  • spark 3.2 版本及以上
  • 参考文献


spark 2.x 版本

spark 2.4.8 版本:

  • https://spark.apache.org/docs/2.4.8/api/python/_modules/pyspark/sql/dataframe.html#DataFrame.toPandas

源代码:

@since(1.3)
    def toPandas(self):
        """
        Returns the contents of this :class:`DataFrame

本文同步分享在 博客“shiter”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

Pandas DataFrame 跨组计算平均值

Pandas DataFrame 跨组计算平均值

如何解决Pandas DataFrame 跨组计算平均值?

所以我有一个数据框,其中包含具有不同超参数的实验数据和一个名为 repeat_id 的特殊值,我们必须运行该值才能找到统计显着性。我基本上是在尝试计算不同 repeat_id 上任何其他记录值的平均值。这与计算组内均值的标准 GroupBy.mean 不同,这里我需要诸如 组均值之类的东西。示例:

   repeat_id variant  measuerment_0 measuerment_1 ... measuerment_n
0  0         ''A''      0.0           1.0               2.0
1  1         ''A''      0.2           0.4               0.6
2  0         ''B''      0.1           1.1               2.1
3  1         ''B''      0.3           0.5               0.7

预期输出:

   variant  measuerment_0 measuerment_1 ... measuerment_n
0  ''A''      0.1           0.7               1.3
1  ''B''      0.2           0.8               1.4

解决方法

您也可以使用 pivot_table() 函数执行此操作。

df.pivot_table(index=''variant'',aggfunc=''mean'').drop(columns=''repeat_id'')

Pandas DataFrame上特定于组的计算

Pandas DataFrame上特定于组的计算

您可以从价格中减去均值分组,以创建一个名为Price_Diff_Mean的新列。使用.transform('mean')为列price创建一系列长度相同的值,并从price中减去这些值:

df['Price_Diff_Mean'] = df['price'] - df.groupby('brand')['price'].transform('mean')
df
Out[6]: 
       product   brand  price  Price_Diff_Mean
0      macbook   Apple   1000             -200
1  macbook air   Apple   1200                0
2  macbook pro   Apple   1400              200
3    thinkbook  Lenovo    600             -100
4     thinkpad  Lenovo    800              100

或者,您可以在.assign中添加一列,这将为您提供相同的结果:

df = df.assign(Price_Diff_Mean = df['price'] - df.groupby('brand')['price'].transform('mean'))
,

在我看来,这是一种更为优雅的方式:

df['newcolumn'] = df.groupby('brand').transform(lambda x: x - x.mean())

今天关于在 Pandas DataFrame 中选择日期来计算夏令时pandas日期函数的分享就到这里,希望大家有所收获,若想了解更多关于Pandas - 使用一个 Dataframe 列的子字符串比较两个 Dataframe、pandas dataframe 与 spark dataframe 互相转换(数据类型应该怎么转换呢?)、Pandas DataFrame 跨组计算平均值、Pandas DataFrame上特定于组的计算等相关知识,可以在本站进行查询。

本文标签: