我想复制我的熊猫'数据框的行,并在列FROM
和TO
之间的分钟内添加一个时间序列的附加列。
例如,我有这个数据框。
ID FROM TO
A 15:30 15:33
B 16:40 16:44
C 15:20 15:22
我想要的输出是
ID FROM TO time
A 15:30 15:33 15:30
A 15:30 15:33 15:31
A 15:30 15:33 15:32
A 15:30 15:33 15:33
B 16:40 16:41 16:40
B 16:40 16:41 16:41
C 15:20 15:22 15:20
C 15:20 15:22 15:21
C 15:20 15:22 15:22
在 R 中,我可以执行此操作:new_df = setDT(df)[, .(ID, FROM, TO, time=seq(FROM,TO,by="mins")), by=1:nrow(df)]
,但我无法找到与此等效的Python。
提前谢谢!
答案 0 :(得分:1)
解决问题的两个步骤:
带有pd.date_range
和 apply
的 strftime
df['duration'] = df.apply(
lambda row: [
i.strftime('%H:%M')
for i in pd.date_range(
row['FROM'], row['TO'], freq='60s'
)
],
axis=1)
ID FROM TO duration
0 A 15:30 15:33 [15:30, 15:31, 15:32, 15:33]
1 B 16:40 16:44 [16:40, 16:41, 16:42, 16:43, 16:44]
2 C 15:20 15:22 [15:20, 15:21, 15:22]
使用 apply
stack
df.set_index(['ID', 'FROM', 'TO']) \
.duration.apply(pd.Series) \
.stack().reset_index(level=3, drop=True) \
.reset_index() \
.set_index('ID')
# Result
FROM TO 0
ID
A 15:30 15:33 15:30
A 15:30 15:33 15:31
A 15:30 15:33 15:32
A 15:30 15:33 15:33
B 16:40 16:44 16:40
B 16:40 16:44 16:41
B 16:40 16:44 16:42
B 16:40 16:44 16:43
B 16:40 16:44 16:44
C 15:20 15:22 15:20
C 15:20 15:22 15:21
C 15:20 15:22 15:22
答案 1 :(得分:1)
这是@chrisz使用concat
和iterrows
以及date_range
仅限于一步的类似
df = pd.concat([pd.DataFrame({
'ID':row.ID,
'FROM': row.FROM,
'TO': row.TO,
'TIME': pd.Series(pd.date_range(row.FROM, row.TO, freq='60s').time).astype(str).str[:5]
}) for _, row in df.iterrows()])
TIME FROM ID TO
0 15:30 15:30 A 15:33
1 15:31 15:30 A 15:33
2 15:32 15:30 A 15:33
3 15:33 15:30 A 15:33
0 16:40 16:40 B 16:44
1 16:41 16:40 B 16:44
2 16:42 16:40 B 16:44
3 16:43 16:40 B 16:44
4 16:44 16:40 B 16:44
0 15:20 15:20 C 15:22
1 15:21 15:20 C 15:22
2 15:22 15:20 C 15:22