【问题标题】:Problems transforming data in a dataframe在数据框中转换数据的问题
【发布时间】:2018-12-10 19:52:38
【问题描述】:

我已经在下面编写了函数(经过测试和工作):

import pandas as pd

def ConvertStrDateToWeekId(strDate):
    dateformat = '2016-7-15 22:44:09'
    aDate = pd.to_datetime(strDate)
    wk = aDate.isocalendar()[1]
    yr = aDate.isocalendar()[0]
    Format_4_5_4_date = str(yr) + str(wk)
    return Format_4_5_4_date'

根据我在网上看到的情况,我应该可以这样使用它:

ml_poLines = result.value.select('PURCHASEORDERNUMBER', 'ITEMNUMBER', PRODUCTCOLORID', 'RECEIVINGWAREHOUSEID', ConvertStrDateToWeekId('CONFIRMEDDELIVERYDATE'))

但是,当我“显示”我的数据框时,"CONFIRMEDDELIVERYDATE" 列是原始日期时间字符串!没有给出错误。

我也试过这个:

ml_poLines['WeekId'] = (ConvertStrDateToWeekId(ml_poLines['CONFIRMEDDELIVERYDATE']))

并得到以下错误:

"ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions." which makes no sense to me.

我也试过了,没有成功。

 x = ml_poLines.toPandas();
 x['testDates'] = ConvertStrDateToWeekId(x['CONFIRMEDDELIVERYDATE'])
 ml_poLines2 = spark.createDataFrame(x)
 ml_poLines2.show()

以上产生如下错误:

AttributeError: 'Series' object has no attribute 'isocalendar'

我做错了什么?

【问题讨论】:

    标签: python dataframe azure-databricks


    【解决方案1】:

    您的函数ConvertStrDateToWeekId 接受一个字符串。但在下一行中,函数调用的参数是一系列字符串:

    x['testDates'] = ConvertStrDateToWeekId(x['CONFIRMEDDELIVERYDATE'])
    

    这个错误的一个可能的解决方法是使用pandas的@​​987654323@-function:

    x['testDates'] = x['CONFIRMEDDELIVERYDATE'].apply(ConvertStrDateToWeekId)
    

    但如果没有关于您正在处理的数据类型的更多信息,就很难提供进一步的帮助。

    【讨论】:

    • 源数据架构为:root |-- PURCHASEORDERNUMBER: string (nullable = true) |-- ITEMNUMBER: integer (nullable = true) |-- PRODUCTCOLORID: integer (nullable = true) |- - RECEIVINGWAREHOUSEID: 字符串 (nullable = true) |-- CONFIRMEDDELIVERYDATE: string (nullable = true)
    • 样本数据:| PO-000000185| 1773981| 481|直流| 1900-01-01 00:00:00|
    【解决方案2】:

    这是我必须工作的解决方法:

    `# convert the confirimedDeliveryDate to a WeekId
     x= ml_poLines.toPandas();
     x['WeekId'] = x[['ITEMNUMBER', 'CONFIRMEDDELIVERYDATE']].apply(lambda y:ConvertStrDateToWeekId(y[1]), axis=1)
     ml_poLines = spark.createDataFrame(x)
     ml_poLines.show()`
    

    没有我想要的那么干净。 也许其他人会提出更清洁的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-09
      • 2021-12-05
      • 1970-01-01
      • 2020-12-13
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多