【问题标题】:Extract month from datetime column in pandas DataFrame从 pandas DataFrame 中的日期时间列中提取月份
【发布时间】:2021-09-29 11:53:55
【问题描述】:

我有一个从 Excel 中读取的 DataFrame,其中包含 DateTime 类型的列之一。

sales_data=pandas.read_excel(r'Sample Sales Data.xlsx')

我能够使用 str.extract/lambda 函数从其他列中提取子字符串。但我无法处理“订单日期”列

命令sales_data['Order Date'] 给出以下输出

按照other StackOverflow questions 的建议,我尝试了

sales_data['Order Date'].apply(lambda x:x.str.slice())

我收到一个错误:AttributeError: 'datetime.datetime' object has no attribute 'str' 要检查订单日期列的类型,我尝试了

sales_data['Order Date'].apply(lambda x:type(x))

我得到了类型 datetime.datetime 但是当我尝试日期时间操作时

sales_data['Order Date'].apply(lambda x:x.strftime("m"))

我收到错误:AttributeError: 'int' object has no attribute 'strftime' 我收到了类似的命令错误

sales_data['Order Date'].apply(lambda x:x.dt.month)

请建议一种方法,将月份从日期时间对象中提取到另一列中,而无需遍历 DataFrame。我无法在此列中使用 datetime 或 int 函数,因为它既是 datetime 又是 int 列。

【问题讨论】:

    标签: python pandas dataframe datetime lambda


    【解决方案1】:

    使用dt访问器:

    sales_data=pandas.read_excel(r'Sample Sales Data.xlsx', parse_dates=['Order Date'])
    sales_data['Order Date'].dt.month
    

    假设这个数据框:

    >>> sales_data
                Order Date
    0  2016-01-01 00:00:00
    1  2016-03-28 22:00:00
    
    >>> sales_data['month'] = sales_data['Order Date'].dt.month
    >>> sales_data
               Order Date  month
    0 2016-01-01 00:00:00      1
    1 2016-03-28 22:00:00      3
    
    

    【讨论】:

    • 感谢您的建议。我试过了,但 to_datetime 函数出错了。 ValueError:在传递的数组中混合了日期时间和整数
    【解决方案2】:

    尝试使用pd.to_datetime 确保您的列数据类型为datetime。然后使用dt.month 提取月份。您还可以分别使用dt.daydt.year 提取日期和年份。

    import pandas as pd
    
    sales_data = pd.read_excel(r'Sample Sales Data.xlsx')
    sales_data['Order_Month'] = pd.to_datetime(sales_data['Order Date']).dt.month
    

    【讨论】:

      【解决方案3】:

      我发现了问题。 由于某些输入数据不准确,The sales_data['Order Date'] 列混合了日期和 int 值。 我发现这个是因为

      sales_data['DateType']=sales_data['Order Date'].apply(lambda x:type(x))
      sales_data['DateType'].unique() 
      

      返回array([<class 'datetime.datetime'>, <class 'int'>], dtype=object) 我通过过滤掉没有 datetype 作为 datetime 的值来清理这个 DataFrame。

      type1=type(sales_data['DateType'][0])
      new_df=sales_data[sales_data['DataType']==type1]
      

      现在新的数据框支持日期和字符串操作。

      pd.to_datetime(new_df['Order Date']).dt.month
      

      这可以分配给其他列。

      【讨论】:

        猜你喜欢
        • 2014-09-28
        • 2015-01-18
        • 2019-04-25
        • 1970-01-01
        • 1970-01-01
        • 2019-01-07
        • 2019-03-20
        相关资源
        最近更新 更多