python - 日期和值列拆分为两列
问题描述
我有一个包含日期和值的一维 float64 数据,如下所示:
2019-03-08 00:00:00-03:00 0.0
2019-03-08 00:01:00-03:00 0.0
2019-03-08 00:02:00-03:00 0.0
2019-03-08 00:03:00-03:00 0.0
2019-03-08 00:04:00-03:00 0.0
...
2019-03-08 23:55:00-03:00 0.0
2019-03-08 23:56:00-03:00 0.0
2019-03-08 23:57:00-03:00 0.0
2019-03-08 23:58:00-03:00 0.0
2019-03-08 23:59:00-03:00 0.0
Freq: T, Name: ABC, Length: 1440, dtype: float64
我想拆分时间和价值数据并将它们简单地放入两列(“日期”和“价值”)。
我尝试了以下方法来了解:
df.shape
(1440,)
df.dtypes
dtype('float64')
看到它的一维数据,我试图将格式更改为数据框
df2=df.to_frame()
df2.shape
(1440,1)
在那里,我尝试了“str.split”和我在互联网上搜索的其他命令,但没有一个有效。我忍不住像这样“绕道”:
df2.to_csv('Test.csv')
df_interim=pd.read_csv('Test.csv')
df_interim.rename(columns={"Unnamed: 0": "Time","ABC":"Value"},inplace=True)
df_interim.set_index('Time')
df_interim.to_csv('complete.csv')
当然,它可以工作,但是我想更有效地做到这一点,而不是创建一个 csv 文件,读取它并保存它只是为了解决这个问题。我应该实施什么?这可能很简单,但我还没有通过
------第一次编辑。附上原始编码----我使用的库如下:
from pvlib import solarposition, tracking
import pandas as pd
import matplotlib.pyplot as plt
tz = 'US/Eastern'
lat, lon = 40, -80
times = pd.date_range('2019-01-01', '2019-01-02', closed='left', freq='5min',
tz=tz)
solpos = solarposition.get_solarposition(times, lat, lon)
truetracking_angles = tracking.singleaxis(
apparent_zenith=solpos['apparent_zenith'],
apparent_azimuth=solpos['azimuth'],
axis_tilt=0,
axis_azimuth=180,
max_angle=90,
backtrack=False, # for true-tracking
gcr=0.5) # irrelevant for true-tracking
truetracking_position = truetracking_angles['tracker_theta'].fillna(0)
当输入时,
truetracking_position
我懂了
2019-01-01 00:00:00-05:00 0.0
2019-01-01 00:05:00-05:00 0.0
2019-01-01 00:10:00-05:00 0.0
2019-01-01 00:15:00-05:00 0.0
2019-01-01 00:20:00-05:00 0.0
...
2019-01-01 23:35:00-05:00 0.0
2019-01-01 23:40:00-05:00 0.0
2019-01-01 23:45:00-05:00 0.0
2019-01-01 23:50:00-05:00 0.0
2019-01-01 23:55:00-05:00 0.0
Freq: 5T, Name: tracker_theta, Length: 288, dtype: float64
它给出了一个奇怪的 (1440,0) 形状的字符串..
解决方案
您无需更改此数据框中的任何内容,称为truetracking_position
. 原因是日期时间被视为行以便于访问values
. 我安装了模块pvlib
并运行了相同的程序。它不是字符串向量,而是 floa64 数据类型的数据框。
除非您希望它使用 2 列作为数据保存到 csv 中,否则拆分它实际上不是一个好主意。为什么?看看下面它可以为您做什么。
In [58]: truetracking_position['2019-01-01 12:30:00-05:00']
Out[58]: 3.2641041244419426
In [60]: truetracking_position['2019-01-01 12']
Out[60]:
2019-01-01 12:00:00-05:00 -11.814614
2019-01-01 12:05:00-05:00 -9.333005
2019-01-01 12:10:00-05:00 -6.831898
2019-01-01 12:15:00-05:00 -4.316320
2019-01-01 12:20:00-05:00 -1.791519
2019-01-01 12:25:00-05:00 0.737108
2019-01-01 12:30:00-05:00 3.264104
2019-01-01 12:35:00-05:00 5.784038
2019-01-01 12:40:00-05:00 8.291590
2019-01-01 12:45:00-05:00 10.781636
2019-01-01 12:50:00-05:00 13.249319
2019-01-01 12:55:00-05:00 15.690115
Freq: 5T, Name: tracker_theta, dtype: float64
In [73]: truetracking_position[truetracking_position!=0]
Out[73]:
2019-01-01 07:45:00-05:00 -89.752336
2019-01-01 07:50:00-05:00 -88.923132
2019-01-01 07:55:00-05:00 -88.049750
2019-01-01 08:00:00-05:00 -87.140644
2019-01-01 08:05:00-05:00 -86.203868
...
2019-01-01 16:40:00-05:00 85.782406
2019-01-01 16:45:00-05:00 86.729102
2019-01-01 16:50:00-05:00 87.650821
2019-01-01 16:55:00-05:00 88.540767
2019-01-01 17:00:00-05:00 89.389841
Freq: 5T, Name: tracker_theta, Length: 112, dtype: float64
在上面的代码行中,您也可以使用时间、时间范围、特定日期或确切时间简单地访问数据。所以,基本上这里的日期key
时间在字典中是很好的。另外,您可以进一步处理数据。例如,在上面的代码行中,我尝试访问 3 件事。第一个是在特定的日期时间,价值是什么。其次,我尝试从 12 点到 12:55 访问基本上一小时的数据。第三,我尝试了数据帧的哪些值truetracking_position
是非零的,并查看了那些漂亮的输出。
即使您可以直接从这里绘制数据。在下面查看您的代码中的一些变化。
from pvlib import solarposition, tracking
import pandas as pd
import matplotlib.pyplot as plt
tz = 'US/Eastern'
lat, lon = 40, -80
times = pd.date_range('2019-01-01', '2019-01-02', closed='left', freq='5min',
tz=tz)
solpos = solarposition.get_solarposition(times, lat, lon)
truetracking_angles = tracking.singleaxis(
apparent_zenith=solpos['apparent_zenith'],
apparent_azimuth=solpos['azimuth'],
axis_tilt=0,
axis_azimuth=180,
max_angle=90,
backtrack=False, # for true-tracking
gcr=0.5) # irrelevant for true-tracking
truetracking_position = truetracking_angles['tracker_theta'].fillna(0)
ttp = pd.DataFrame({'Time':truetracking_position.index, 'Value':truetracking_position.values}) # Convert to dataframe with the datetime as a column
ttp.to_csv("ttp_data.csv") # save to csv
ttp_non_zero = truetracking_position[truetracking_position!=0] # Extract non-zero Values
fig, ax = plt.subplots() # Add 2 subplots in one pic.
ttp_non_zero.plot(color='red',linewidth=4,linestyle='dashed') # Plot the non-zero data directly.
truetracking_position.plot(color='green',linewidth=2) # Plot all data directly.
plt.show()
话虽如此,除非您只想将其保存到 csv 中并且您已经完成整个程序/项目并且不想进一步使用这些数据,否则我不建议拆分。使用数据就像使用具有许多额外功能的字典查找一样。
编辑:为根据问题将数据保存到 csv 文件而编辑的代码,可用于可视化软件。
推荐阅读
- php - MYSQL 连接关系
- azure - 如何与 New-AzureRmResourceGroupDeployment cmdlet 一起传递额外参数
- javascript - 单击 WebGL(画布)中的选定坐标
- r - Rmarkdown:在标签集下添加标题
- variables - VueJS - 在字符串中插入字符串
- javascript - 香草 JavaScript 替换元素
- r - 遍历忽略但保留 R 中的 NA 值的列
- laravel - 在 laravel vue 项目中使用 laravel mix 如何在所有组件中包含 scss 文件?
- dom - 如何将我的功能调制为单独的并行测试?
- python - Django 模板语法错误