【问题标题】:ValueError Pandas duplicate rows with time sequence using Numpy arangeValueError Pandas 使用 Numpy arange 重复具有时间序列的行
【发布时间】:2018-06-27 21:03:30
【问题描述】:

我目前正在努力寻找比link 中的解决方案更快的解决方案。问题是,当我的数据达到相对庞大的数量(例如 1M 行)时,它会相当慢,尤其是当它是每秒而不是原始帖子中的每分钟时。

所以我正在尝试使用 Numpy arange 找到一种更有效的方法。但是我遇到了错误

#First- with pd.to_datetime
x = pd.DataFrame({ "ID": np.repeat(df.ID.values, df.time_delta.values),
                        "time": np.arange(pd.to_datetime(df.FROM.values), pd.to_datetime(df.TO.values), np.timedelta64(1,'s'))})
#Second - without pd.to_datetime    
x = pd.DataFrame({ "ID": np.repeat(df.ID.values, df.time_delta.values),
                        "time": np.arange(df.FROM.values, df.TO.values, np.timedelta64(1,'s'))})

这里的想法是从 FROM 列到 TO 列重复 ID 多少秒 (time_delta)。但我不断收到错误ValueError: Could not convert object to NumPy timedelta

这是我的dfdtypes

ID                         object
FROM          datetime64[ns, UTC]
TO            datetime64[ns, UTC]
time_delta                  int64
dtype: object

谁能告诉我我做错了什么?

提前谢谢你。

【问题讨论】:

  • 您能否提供输入数据框的示例:例如df.head()df.head().to_dict()

标签: python pandas numpy


【解决方案1】:

你可以使用:

#convert columns to timedeltas
df['FROM'] = pd.to_timedelta(df['FROM'] + ':00')
df['TO'] = pd.to_timedelta(df['TO'] + ':00')

#for each row create timedelta_range and join together
df1 = (pd.concat([pd.Series(r.ID,
                   pd.timedelta_range(r.FROM,r.TO, freq='1Min')) for r in df.itertuples()])
        .reset_index())

df1.columns = ['time','ID']
print (df1)
       time ID
0  15:30:00  A
1  15:31:00  A
2  15:32:00  A
3  15:33:00  A
4  16:40:00  B
5  16:41:00  B
6  16:42:00  B
7  16:43:00  B
8  16:44:00  B
9  15:20:00  C
10 15:21:00  C
11 15:22:00  C

this answer 的 Numpy 解决方案已更改为 timedeltas:

#data from linked question
print (df)
  ID   FROM     TO
0  A  15:30  15:33
1  B  16:40  16:44
2  C  15:20  15:22


#repeat constant
minute = int(60 * 1e9)

#convert both columns to timedeltas and then to numpy arrays
sd = pd.to_timedelta(df['FROM'] + ':00').values
ed = pd.to_timedelta(df['TO'] + ':00').values
dd = ed - sd
#number of repeats
ds = (dd / minute).astype(int) + 1

smins = ds.sum()
cmins = ds.cumsum()
rng = np.arange(smins)
slc = np.roll(cmins % smins, 1)
add = rng - rng[slc].repeat(ds)

#DataFrame constructor
df = pd.DataFrame(dict(
       ID = df.ID.values.repeat(ds),
       time = sd.repeat(ds) + add * minute))

print(df)
   ID     time
0   A 15:30:00
1   A 15:31:00
2   A 15:32:00
3   A 15:33:00
4   B 16:40:00
5   B 16:41:00
6   B 16:42:00
7   B 16:43:00
8   B 16:44:00
9   C 15:20:00
10  C 15:21:00
11  C 15:22:00

【讨论】:

    猜你喜欢
    • 2020-03-11
    • 2013-09-18
    • 1970-01-01
    • 2017-10-20
    • 2013-09-19
    • 2016-01-21
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多