我有一个如下的数据帧
+-----------+------+--------------+
| invoiceNo | time | invoiceValue |
+-----------+------+--------------+
| A | 6 | 2 |
+-----------+------+--------------+
| B | 12 | 3 |
+-----------+------+--------------+
| C | 356 | 5 |
+-----------+------+--------------+
| D | 2145 | 6 |
+-----------+------+--------------+
df = pd.DataFrame({'invoiceNo':['A','B','C','D'],
'time':[6,12,356,2145],
'invoiceValue':[2,3,5,6] })
我的任务是从time
值中提取相应的hour
然而,问题是,理想情况下,time
列应该显示4
位。但是,由于数字格式的原因,它去掉了前导零。因此,这里的6
表示0006
,即00 hour
&06 minutes
为了实现这一点,我编写了下面的代码,它工作得非常好
df['adj-time'] = df['time'].apply(lambda x: '{0:0>4}'.format(x))
df['adj-time'] = df['adj-time'].apply(lambda x: pd.to_datetime(x,format= '%H%M'))
df['hour'] = df['adj-time'].apply(lambda x: x.hour)
df.drop('adj-time',axis=1, inplace=True)
下面是我想要的输出
+-----------+------+--------------+------+
| invoiceNo | time | invoiceValue | hour |
+-----------+------+--------------+------+
| A | 6 | 2 | 0 |
+-----------+------+--------------+------+
| B | 12 | 3 | 0 |
+-----------+------+--------------+------+
| C | 356 | 5 | 3 |
+-----------+------+--------------+------+
| D | 2145 | 6 | 21 |
+-----------+------+--------------+------+
然而,我的问题是,对于大型数据集,上面的代码是very very slow
和time consuming
如何提高性能/速度方面的效率
如果时间是整数,则:
如果是字符串:
zfill
'time'
设置为字符串,转换为日期时间并提取小时组件李>从csv读取
'time'
列的类型,这样就不需要.astype('str')
李>timeit
测试使用字符串操作提取小时数
zfill
最多4个字符(如果还有秒,则为6个),然后对前2个字符进行切片以获得小时数(分钟为[2:4],秒为[4:6])。使用pd.to_numeric
获取数字数据类型如果您有兴趣将
'time'
转换为timedelta64[ns]
数据类型,您可以使用pd.to_datetime
的灵活解析。由于缺少年/月/日,因此默认值为1900-01-01,我们将其减去相关问题 更多 >
编程相关推荐