首页 > 解决方案 > 如何将熊猫数据框从时间与数据重塑为时间与日期与数据

问题描述

我有一个包含每分钟温度数据的大型天气数据集。我想以热图格式将其绘制为时间 vs 日期 vs 温度,就像这样: 几年的温度数据

我在 numpy 中手动执行了一段时间,直到我得到太多数据以至于计算机崩溃了。所以我正在寻找一种方法来使用 pandas 数据框和 plotly 进行这种相同的绘图。

数据框如下所示:

          TimeStamp  AirTemp  Pressure  RelHumidty  HeatIndex  Battery
0        1509159720    78.26     982.9        48.0    78.2600     3.11
1        1509159780    78.08     982.9        48.0    78.0800     3.11
2        1509159840    78.08     982.9        48.0    78.0800     3.11
3        1509159900    78.26     982.8        53.0    78.2600     3.11
4        1509159960    78.62     982.8        48.0    78.6200     3.11
5        1509160020    79.16     982.8        54.0    79.1600     3.11
6        1509160080    80.06     982.9        76.0    83.8179     3.12
7        1509160140    81.50     982.8        50.0    82.2393     3.12
8        1509160200    81.68     982.8        47.0    82.0224     3.12
...             ...      ...       ...         ...        ...      ...

我正在使用的代码片段目前看起来是这样的:

#create axis arrays
dayArray = np.linspace(0,1439,1440,dtype=int)
dateArray = airEndTimePlot - np.arange((airEndTimePlot-airStartTimePlot).days) * timedelta(days=1)

#load data from database
sql_Query = pd.read_sql_query('select * from AirObs', conn)

df = pd.DataFrame(sql_Query, columns=['TimeStamp','AirTemp','Pressure','RelHumidity','HeatIndex','Battery'])

# magic happens #
tempArray = df.AirTemp.<something>

fig = make_subplots(rows=8, cols=1)
fig.append_trace(go.Heatmap(
        z=tempArray,
        x=dateArray,
        y=dayArray,
        colorscale='Viridis'), row=1, col=1)

fig.show()

标签: pythonpandasdataframeplotly

解决方案


最可靠的方法是将您的 unix 时间转换为 Timestamp 对象,下面的代码块将执行此操作,可能有更快的方法将其应用于整个列,但我没有找到任何方便的时间数组包装器

## creating the time column provided
import pandas as pd
df = pd.DataFrame();
df['TimeStamp'] = [1509159720 + (60*i) for i in range(10)]

## new code
df['datetimes'] = [pd.datetime.fromtimestamp(t) for t in df['TimeStamp']]
df['dates'] = [ dt.date() for dt in df['datetimes']]
df['times'] = [ dt.time() for dt in df['datetimes']]
print(df)

输出看起来像

   TimeStamp            datetimes       dates     times
0  1509159720 2017-10-27 20:02:00  2017-10-27  20:02:00
1  1509159780 2017-10-27 20:03:00  2017-10-27  20:03:00
2  1509159840 2017-10-27 20:04:00  2017-10-27  20:04:00
3  1509159900 2017-10-27 20:05:00  2017-10-27  20:05:00
4  1509159960 2017-10-27 20:06:00  2017-10-27  20:06:00
5  1509160020 2017-10-27 20:07:00  2017-10-27  20:07:00
6  1509160080 2017-10-27 20:08:00  2017-10-27  20:08:00
7  1509160140 2017-10-27 20:09:00  2017-10-27  20:09:00
8  1509160200 2017-10-27 20:10:00  2017-10-27  20:10:00
9  1509160260 2017-10-27 20:11:00  2017-10-27  20:11:00

然后你可以创建你的情节

fig.append_trace(go.Heatmap(
    z=tempArray,
    x = df['date'],
    y = df['times'],
    colorscale='Viridis'), row=1, col=1)

更多时间戳信息可以在这里找到:pd Timestamp ref


推荐阅读