如何使用 VBA 或 Python 将行转换为列?
How can I convert rows to column using VBA or Python?
我需要转换顶部的 table,它包含 1 个单次航班的行。
我不知道从哪里开始创建 VBA 或 Python 脚本来转置它以获得底部图表的格式,有什么想法吗?
我对编码和数据操作仍然很陌生,感谢您的帮助。
您可以使用 pandas pivot_table
来完成上述工作。
这是一个例子:
from pandas import DataFrame, read_excel
df = read_excel(<your_file.xlsx>)
altered_df=df.pivot_table(values=['Timestamp'],columns=['Type'], index=[<rest_of_your_columns_that_you_want_to_retain>])
DataFrame(altered_df.to_records())
感谢所有花时间阅读和回复我的问题的人。
我设法使用以下代码找到了 VBA 的方法。在 运行 代码之前必须进行一些操作,例如调整 headers 等
Dim i As Integer 'Import row
Dim k As Integer 'Pivot row
Dim m As Integer 'Pivot column
Dim Timestamp As Date
i = 2
k = 1
Do Until Sheet1.Cells(i, 3) = ""
If Sheet1.Cells(i, 4) <> "" Then
If Sheet1.Cells(i, 3) <> Sheet1.Cells(i - 1, 3) Then
k = k + 1
Sheet2.Cells(k, 2) = Sheet1.Cells(i, 1)
Sheet2.Cells(k, 3) = Sheet1.Cells(i, 4)
Sheet2.Cells(k, 4) = "LGW"
Sheet2.Cells(k, 5) = Sheet1.Cells(i, 6)
Sheet2.Cells(k, 6) = Sheet1.Cells(i, 7)
End If
m = Application.WorksheetFunction.Match(Sheet1.Cells(i, 8), Sheet2.Rows(1), 0)
If Sheet2.Cells(k, 1) = "" Then
Sheet2.Cells(k, 1) = DateSerial(Left(Sheet1.Cells(i, 9), 4), Mid(Sheet1.Cells(i, 9), 6, 2), Mid(Sheet1.Cells(i, 9), 9, 2))
End If
Sheet2.Cells(k, m) = DateSerial(Left(Sheet1.Cells(i, 9), 4), Mid(Sheet1.Cells(i, 9), 6, 2), Mid(Sheet1.Cells(i, 9), 9, 2)) + (Mid(Sheet1.Cells(i, 9), 12, 2) / 24) + (Mid(Sheet1.Cells(i, 9), 15, 2) / 1440) + (Mid(Sheet1.Cells(i, 9), 18, 2) / 86400)
End If
i = i + 1
Loop
End Sub
我需要转换顶部的 table,它包含 1 个单次航班的行。 我不知道从哪里开始创建 VBA 或 Python 脚本来转置它以获得底部图表的格式,有什么想法吗? 我对编码和数据操作仍然很陌生,感谢您的帮助。
您可以使用 pandas pivot_table
来完成上述工作。
这是一个例子:
from pandas import DataFrame, read_excel
df = read_excel(<your_file.xlsx>)
altered_df=df.pivot_table(values=['Timestamp'],columns=['Type'], index=[<rest_of_your_columns_that_you_want_to_retain>])
DataFrame(altered_df.to_records())
感谢所有花时间阅读和回复我的问题的人。 我设法使用以下代码找到了 VBA 的方法。在 运行 代码之前必须进行一些操作,例如调整 headers 等
Dim i As Integer 'Import row
Dim k As Integer 'Pivot row
Dim m As Integer 'Pivot column
Dim Timestamp As Date
i = 2
k = 1
Do Until Sheet1.Cells(i, 3) = ""
If Sheet1.Cells(i, 4) <> "" Then
If Sheet1.Cells(i, 3) <> Sheet1.Cells(i - 1, 3) Then
k = k + 1
Sheet2.Cells(k, 2) = Sheet1.Cells(i, 1)
Sheet2.Cells(k, 3) = Sheet1.Cells(i, 4)
Sheet2.Cells(k, 4) = "LGW"
Sheet2.Cells(k, 5) = Sheet1.Cells(i, 6)
Sheet2.Cells(k, 6) = Sheet1.Cells(i, 7)
End If
m = Application.WorksheetFunction.Match(Sheet1.Cells(i, 8), Sheet2.Rows(1), 0)
If Sheet2.Cells(k, 1) = "" Then
Sheet2.Cells(k, 1) = DateSerial(Left(Sheet1.Cells(i, 9), 4), Mid(Sheet1.Cells(i, 9), 6, 2), Mid(Sheet1.Cells(i, 9), 9, 2))
End If
Sheet2.Cells(k, m) = DateSerial(Left(Sheet1.Cells(i, 9), 4), Mid(Sheet1.Cells(i, 9), 6, 2), Mid(Sheet1.Cells(i, 9), 9, 2)) + (Mid(Sheet1.Cells(i, 9), 12, 2) / 24) + (Mid(Sheet1.Cells(i, 9), 15, 2) / 1440) + (Mid(Sheet1.Cells(i, 9), 18, 2) / 86400)
End If
i = i + 1
Loop
End Sub