首页 > 解决方案 > 日期和值列拆分为两列

问题描述

我有一个包含日期和值的一维 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) 形状的字符串..

标签: pythonpandas

解决方案


您无需更改此数据框中的任何内容,称为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 文件而编辑的代码,可用于可视化软件。


推荐阅读