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

时间:2017-06-08 13:44:59

标签: python pandas date date-conversion

我正在尝试将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不会被添加到更短的日期。
  3. 我尝试了各种其他方法,将原始数据转换为字符串,但它们也无法正常工作。

3 个答案:

答案 0 :(得分:2)

我认为astype需要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

答案 1 :(得分: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 :(得分:0)

以下普通的vanilla(字符串操作)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