Pandas:表示日期的长整数加0

Pandas: Adding 0 to a long integer representing a date

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

20170607155749330:(Year/Month/Day/Hour/Minute/Second/decisecond/centisecond/millisecond)。所以有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 不会添加到更短的日期。

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

我会使用 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 现在作为字符串,并将所有内容转换回整数。

我认为你需要astype with str.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

下面的普通香草(字符串操作)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