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)
我面临两个问题:
- 首先,新建的列不是整数而是对象类型;
- 其次,它只是不起作用,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 现在作为字符串,并将所有内容转换回整数。
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
我正在尝试将 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)
我面临两个问题:
- 首先,新建的列不是整数而是对象类型;
- 其次,它只是不起作用,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 现在作为字符串,并将所有内容转换回整数。
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