Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何从熊猫的年、月、月周和周日中获取日期?_Python 3.x_Pandas - Fatal编程技术网

Python 3.x 如何从熊猫的年、月、月周和周日中获取日期?

Python 3.x 如何从熊猫的年、月、月周和周日中获取日期?,python-3.x,pandas,Python 3.x,Pandas,我有一个熊猫数据框,如下所示 我想创建一个新的列,它根据上面所有列的信息告诉确切的日期。代码应该如下所示: df['Date'] = pd.to_datetime(df['Month']+df['WeekOfMonth']+df['DayOfWeek']+df['Year']) 我能为你的案子找到解决办法。您需要为月份和一周中的几天定义字典 month={“一月”:“01”、“二月”:“02”、“三月”:“03”、“四月”:“04”、“五月”:“05”、“六月”:“06”、“七月”:“07”

我有一个熊猫数据框,如下所示

我想创建一个新的列,它根据上面所有列的信息告诉确切的日期。代码应该如下所示:

df['Date'] = pd.to_datetime(df['Month']+df['WeekOfMonth']+df['DayOfWeek']+df['Year'])

我能为你的案子找到解决办法。您需要为月份和一周中的几天定义字典

month={“一月”:“01”、“二月”:“02”、“三月”:“03”、“四月”:“04”、“五月”:“05”、“六月”:“06”、“七月”:“07”、“八月”:“08”、“九月”:“09”、“十月”:“10”、“十一月”:“11”、“十二月”:“12”}
星期={“星期一”:1,“星期二”:2,“星期三”:3,“星期四”:4,“星期五”:5,“星期六”:6,“星期日”:7}
使用此字典,我对自定义数据帧使用的转换是:

rows=[[“12月”,5日,“星期三”,“1995年”],
[2013年1月3日,星期三]]
df=pd.DataFrame(行、列=[“月”、“周”、“工作日”、“年”])
df['Date']=(df[“Year”]+“-”+df[“Month”].map(Month)+“-”+(df[“Week”].apply(lambda x:(x-1)*7)+df[“Weekday”].map(Week).apply(int)).apply(str)).astype('datetime64[ns])
然而,你必须小心。以您发布的一些数据为例,有些日期超出了日期范围。比如说,

row = ["Oct",5,"Friday","2018"]

显示的日期为2018年10月33日。我建议您使用一些逻辑来过滤数据,以避免此类问题。

让我们按以下三个步骤进行处理:

df = df.drop(['Month_Start', 'DateOffset'], axis=1)
  • Year
    month
  • 计算日期偏移量
    DateOffset
    相对于
    Month\u Start
    WeekOfMonth
    DayOfWeek
  • Month\u Start
    DateOffset
  • 以下是代码:

    df['Month_Start'] = pd.to_datetime(df['Year'].astype(str) + df['Month'] + '01', format="%Y%b%d")
    
    import time
    df['DateOffset'] = (df['WeekOfMonth'] - 1) * 7 + df['DayOfWeek'].map(lambda x: time.strptime(x, '%A').tm_wday) - df['Month_Start'].dt.dayofweek
    
    df['Date'] = df['Month_Start'] + pd.to_timedelta(df['DateOffset'], unit='D')
    
    输出:

      Month  WeekOfMonth  DayOfWeek  Year Month_Start  DateOffset       Date
    0   Dec            5  Wednesday  1995  1995-12-01          26 1995-12-27
    1   Jan            3  Wednesday  2013  2013-01-01          15 2013-01-16
    2   Oct            5     Friday  2018  2018-10-01          32 2018-11-02
    3   Jun            2   Saturday  1980  1980-06-01           6 1980-06-07
    4   Jan            5     Monday  1976  1976-01-01          25 1976-01-26
    
    Date
    列现在包含从其他列的信息派生的日期

    如果愿意,可以按如下方式删除工作临时列:

    df = df.drop(['Month_Start', 'DateOffset'], axis=1)
    

    谢谢Fran@Abhaykumar. 如果这是你想要的答案,请检查它是否被接受并投票。@Sergedegossondevarenes这是一个好答案,但不是一个好答案。我的数据中有许多实例的日期超过31。示例数据中是否有错误?第三排,2018年10月5日星期,没有星期五。直到本月的那个星期的星期三。让我知道你的数据是否会有这样的无效数字,以及你想如何处理它。设置在月底或下个月?如果我的解决方案需要任何澄清或您有任何进一步的要求,请随时通知我。:-)