【问题标题】:convert days difference to numeric values in python pandas将天差转换为python pandas中的数值
【发布时间】:2015-03-26 04:25:44
【问题描述】:

我的数据框中有一列“datedif”:

  exposuredate min_exposure_date    datedif
  2014-10-08   2014-09-27           11 days
  2014-10-09   2014-09-27           12 days
  2014-09-27   2014-09-27           0 days
  2014-09-27   2014-09-27           0 days
  2014-10-22   2014-09-27           25 days

  data.exposuredate = pd.to_datetime(data.exposuredate)
  data.min_exposure_date = pd.to_datetime(data.min_exposure_date)

  data['datedif'] = ((data.exposuredate)-(data.min_exposure_date))

列的格式是 datetime64[ns]。我想提取“datedif”字段中的天数。我找不到任何可以帮助我提取天数差异的东西。

我试过了:

data['datedif_day'] = data['datedif'].dt.days

错误:

AttributeError: 'Series' 对象没有属性 'dt'

【问题讨论】:

  • 很好。祝你好运。你有问题吗?
  • 再次引用 mysel :“我想提取字段 'datedif' 中的天数”。这意味着该日期字段“datedif”中有多少天?
  • 那么您尝试了什么,您当前的代码到底有什么问题?这不是代码编写服务。
  • 再说一次,这不是代码编写服务。你做了什么研究?你试过什么?
  • 删除或注释掉data.datedif = pd.to_datetime(data.datedif) - 然后datedif 将成为Timedelta object

标签: python pandas datetime-format python-datetime


【解决方案1】:

Pandas 文档与您正在寻找的转化类型相关,如 Frequency Conversion

这两个选项是 1) 除以 Timedelta 或 2) 类型转换。如文档中所述,两者之间存在细微差别:

“请注意,numpy 标量的除法是真正的除法,而 astyping 相当于地板除法。”

data = pd.DataFrame([("2014-10-08", "2014-09-27"),
                     ("2014-10-09", "2014-09-27"),
                     ("2014-09-27", "2014-09-27"),
                     ("2014-10-22", "2014-09-27")],
                    columns=["exposuredate", "min_exposure_date"])

data['datediff'] =   pd.to_datetime(data.exposuredate) 
                   - pd.to_datetime(data.min_exposure_date)

data['datediff'] / pd.Timedelta(1, unit='d')
data['datediff'].astype('timedelta64[D]')

两个操作都产生了:

0    11.0
1    12.0
2     0.0
3    25.0
Name: datediff, dtype: float64

如果您将日期差异用作训练机器学习算法的特征,那么它们以何种形式表示并不重要,因为无论如何都应该对其进行规范化。 timedelta64[ns] 非常适合。关于可视化目的,请参阅this post

【讨论】:

    【解决方案2】:

    'datedif' 看起来是以天为单位的,但实际上是以秒为单位的。因此,为了获得进一步使用的天数,在代码中添加以下行:

       data['datedif'] = data['datedif'].astype(np.numpy64)
       data['datedif_day'] = (data['datedif']/86400000000000)
    

    【讨论】:

      【解决方案3】:

      今天遇到同样的问题,我认为以下解决方案是最简单的:

      设置:

      df = pd.DataFrame([("2014-10-08", "2014-09-27"),
                           ("2014-10-09", "2014-09-27"),
                           ("2014-09-27", "2014-09-27"),
                           ("2014-10-22", "2014-09-27")],
                          columns=["exposuredate", "min_exposure_date"])
      
      df['datediff'] =   pd.to_datetime(df.exposuredate) - pd.to_datetime(df.min_exposure_date)
      
          exposuredate    min_exposure_date   datediff
      0   2014-10-08      2014-09-27          11 days
      1   2014-10-09      2014-09-27          12 days
      2   2014-09-27      2014-09-27          0 days
      3   2014-10-22      2014-09-27          25 days
      

      解决方案:

      df.datediff.apply(lambda x: x.days)
      
      0    11
      1    12
      2     0
      3    25
      Name: datediff, dtype: int64
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-24
        • 1970-01-01
        • 2021-04-07
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        • 2017-10-25
        相关资源
        最近更新 更多