我正在尝试将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)
我面临两个问题:
我尝试了各种其他方法,将原始数据转换为字符串,但它们也无法正常工作。
答案 0 :(得分:2)
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