【问题标题】:Pandas: Adding 0 to a long integer representing a datePandas:将 0 添加到表示日期的长整数
【发布时间】:2017-11-10 06:30:08
【问题描述】:

我正在尝试将 csv 导入熊猫。此 csv 包含如下数据列(例如):

20170607155749330:(年/月/日/小时/分钟/秒/分秒/厘秒/毫秒)。所以有 17 个数字代表日期。

我遇到的问题是,对于这个特定的数据集,某些行的日期精度不同,例如: 2017060715581995 :这里只有 16 个数字,因为缺少毫秒。

我想做的很简单:将每一行的每个日期转换为我最终得到 17 位的方式,当其中一个缺失时添加一个 0。

这是我为此编写的函数:

def convert_value(val):
   return ('{:0<17}'.format(val))

所以我尝试通过创建一个新列将其应用于每一行,例如:

file_temp['Time_Transformed'] = file_temp.apply( lambda x: convert_value(x["TIME"]) , axis =1)

我面临两个问题:

  1. 首先,新创建的列不是整数,而是对象类型;
  2. 其次,它只是不起作用,0 不会添加到较短的日期。

我尝试了各种其他方法,将原始数据转换为字符串,但它们也不起作用。

【问题讨论】:

    标签: python pandas date date-conversion


    【解决方案1】:

    我会使用ljust 字符串方法并转换为整数。从一个简单的数据框开始:

    In [4]: df = pd.DataFrame([20170607155749330,20170607155749])
    
    In [5]: df
    Out[5]: 
                       0
    0  20170607155749330
    1     20170607155749
    

    我们可以添加一列:

    In [11]: df['T'] = df[0].apply(lambda x: int(str(x).ljust(17,'0')))
    
    In [12]: df
    Out[12]: 
                       0                  T
    0  20170607155749330  20170607155749330
    1     20170607155749  20170607155749000
    

    基本上我们使用ljust(17,'0')0 添加到整数末尾的固定长度17 现在作为字符串,然后将所有内容转换回整数。

    【讨论】:

      【解决方案2】:

      我认为你需要astypestr.ljust

      df = pd.DataFrame({'A':[20170607155749330,20170607155749]})
      
      df['new'] = df['A'].astype(str).str.ljust(17, '0').astype('int64')
      print (df)
                         A                new
      0  20170607155749330  20170607155749330
      1     20170607155749  20170607155749000
      

      对于日期时间:

      df['date'] = pd.to_datetime(df['A'].astype(str).str.ljust(17, '0'), format='%Y%m%d%M%S%f')
      print (df)
                         A                       date
      0  20170607155749330 2017-06-07 00:15:57.493300
      1     20170607155749 2017-06-07 00:15:57.490000
      

      等同于:

      df['date'] = pd.to_datetime(df['A'], format='%Y%m%d%M%S%f')
      print (df)
                         A                       date
      0  20170607155749330 2017-06-07 00:15:57.493300
      1     20170607155749 2017-06-07 00:15:57.490000
      

      【讨论】:

      • 很好,它正在工作!现在我有一个问题,当我尝试使用 pd.to_datetime 时出现错误“DataFrame”对象没有属性“to_datetime”。我试图用谷歌搜索它,但我没有看到任何解决方案。
      • 您需要选择DataFrame的列,所以检查print (df.columns)然后使用pd.to_datetime(df[colname], format='%Y%m%d%M%S%f')。所以如果列是0 需要pd.to_datetime(df['0'], format='%Y%m%d%M%S%f')pd.to_datetime(df[0], format='%Y%m%d%M%S%f')
      • 感谢您的帮助,但我仍然有同样的问题,显然我的数据框由于某种特殊原因没有“to_datetime”模块?我检查了我的熊猫版本是 0.20.1
      • 可能是错字,不是df.to_datetime byt pd.to_datetime
      【解决方案3】:

      以下普通的普通(字符串操作)Python 可以解决问题:

      from __future__ import print_function
      
      def conv_date(date__):
          date_ = str(date__)
          len_ = len(date_)
      
          if len_ == max_:
              return date__
          else:
              return int(date_ + '0' * (max_ - len_))
      
      
      if __name__ == "__main__":
          max_ = 17
          dates = [20170607155749330, 2017060715581995]
          for date_ in dates:
              print(date_, "\t", conv_date(date_))
      

      即输出为:

      20170607155749330        20170607155749330
      2017060715581995         20170607155819950
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-19
        • 1970-01-01
        • 2021-08-13
        相关资源
        最近更新 更多