如何为DataFrame子集的DateTime列逐行递增1秒
问题:生成逐秒递增DateTime列的DataFrame子集
我需要创建DataFrame子集,使每个子集的DateTime列从指定起始时间开始逐行递增1秒,而非保持单一值。当前代码运行后,每个temp_df的DateTime列均为同一值,无法实现逐秒递增,求修改方案。
现有代码
import pandas as pd import numpy as np from datetime import datetime st= pd.Timestamp('2018-06-18 07:59:20') startDate = st for labour in range(2): for trip in range(np.random.randint(5,7)): temp_df = redf[:3000].copy() temp_df['labor_id'] = labour temp_df['DateTime'] = startDate for i in range(len(temp_df)): temp_df['DateTime'] += datetime.timedelta(seconds=1) startDate += datetime.timedelta(days=1, minutes=12, seconds = 3) print(temp_df['DateTime'].head(3))
当前输出
0 2018-06-18 08:49:20 1 2018-06-18 08:49:20 2 2018-06-18 08:49:20 Name: DateTime, dtype: datetime64[ns] ...(其余输出略)
期望输出
0 2018-06-18 08:49:20 1 2018-06-18 08:49:21 2 2018-06-18 08:49:22 Name: DateTime, dtype: datetime64[ns] ...(其余输出略)
解决方案
问题根源
原代码的错误在于:先将整个DateTime列赋值为startDate,随后循环len(temp_df)次,每次给整列加1秒。这导致每一行的时间都被累加了3000次1秒,最终所有行的时间完全相同。
修改后的代码
使用pandas内置的pd.date_range()直接生成逐秒递增的时间序列,替代低效且错误的循环操作:
import pandas as pd import numpy as np from datetime import datetime st= pd.Timestamp('2018-06-18 07:59:20') startDate = st for labour in range(2): for trip in range(np.random.randint(5,7)): temp_df = redf[:3000].copy() temp_df['labor_id'] = labour # 直接生成从startDate开始,共len(temp_df)个间隔1秒的时间点 temp_df['DateTime'] = pd.date_range(start=startDate, periods=len(temp_df), freq='S') startDate += datetime.timedelta(days=1, minutes=12, seconds = 3) print(temp_df['DateTime'].head(3))
说明
pd.date_range(start=startDate, periods=len(temp_df), freq='S')会生成一个长度与temp_df一致的时间序列,起始时间为startDate,每个后续时间点比前一个晚1秒。- 这种方法不仅逻辑正确,而且比逐行循环的效率高得多(尤其是处理大数据量时)。
内容的提问来源于stack exchange,提问作者Sushil Kokil
相关产品推荐
相关产品推荐

