python - 将每小时温度表转换为 pandas 中的单个时间序列?

标签 python pandas

我有一个 pandas 数据框,其中包含来自 24 小时购物地点的以下客户数据:

Date      #Cust at 00:00 Items/Cust at 00:00  Ttl Items at 00:00 #Cust at 01:00 Items/Cust at 01:00  Ttl Items at 01:00 ....#Cust at 23:00 Items/Cust at 23:00  Ttl Items at 23:00
1/1/2018       2            4                         8                1           5                         5                    3            3                       9
1/2/2018       2            5                        10                1           5                         5                    3            4                      12
....

我想把它变成一个简单的时间序列数据框:

Time Stamp         #Cust  Items/Cust Ttl Cust
00:00 1/1/2018      2         4         8
01:00 1/1/2018      1         5         5 
.....
23:00 1/1/2018      3         3         9
00:00 1/1/2018      2         5        10
01:00 1/1/2018      1         5         5 
.....
23:00 1/1/2018      3         4        12

等....

我知道它应该涉及 pd.melt,但考虑到我有多个值列,我无法弄清楚语法。

最佳答案

您可以先通过DataFrame.set_index 不使用at 按列创建索引, 然后使用 str.splitMultiIndex 的列,因此可能使用 DataFrame.stack .上次数据清理 - DataFrame.swaplevel , DataFrame.rename_axisDataFrame.reset_index :

df = df.set_index('Date')
df.columns = df.columns.str.split(' at ', expand=True)
df1 = df.stack().swaplevel(1,0).rename_axis(('Time','Stamp')).reset_index()
print (df1)
    Time     Stamp  #Cust  Items/Cust  Ttl Items
0  00:00  1/1/2018      2           4          8
1  01:00  1/1/2018      1           5          5
2  23:00  1/1/2018      3           3          9
3  00:00  1/2/2018      2           5         10
4  01:00  1/2/2018      1           5          5
5  23:00  1/2/2018      3           4         12

如果需要日期时间:

df = df.set_index('Date')
df.columns = df.columns.str.split(' at ',expand=True)
df1 = df.stack().swaplevel(1,0).rename_axis(('TimeStamp','Date')).reset_index()
df1['TimeStamp'] = pd.to_datetime(df1.pop('Date') + ' ' + df1['TimeStamp'])
print (df1)
            TimeStamp  #Cust  Items/Cust  Ttl Items
0 2018-01-01 00:00:00      2           4          8
1 2018-01-01 01:00:00      1           5          5
2 2018-01-01 23:00:00      3           3          9
3 2018-01-02 00:00:00      2           5         10
4 2018-01-02 01:00:00      1           5          5
5 2018-01-02 23:00:00      3           4         12

还有 DatetimeIndex:

df = df.set_index('Date')
df.columns = df.columns.str.split(' at ',expand=True)
df1 = df.stack()
idx = pd.to_datetime(df1.index.get_level_values(0) + ' ' + df1.index.get_level_values(1))
df1 = df1.set_index(idx).rename_axis('Timestamp')
print (df1)
                     #Cust  Items/Cust  Ttl Items
Timestamp                                        
2018-01-01 00:00:00      2           4          8
2018-01-01 01:00:00      1           5          5
2018-01-01 23:00:00      3           3          9
2018-01-02 00:00:00      2           5         10
2018-01-02 01:00:00      1           5          5
2018-01-02 23:00:00      3           4         12

关于python - 将每小时温度表转换为 pandas 中的单个时间序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57157616/

相关文章:

python - 在电子邮件中发送多个 HTML 表

python - 从数据框列中删除特定的一天(Pandas)

python - 单行指向线串

python - 用字符串键构造字典时,我应该在 Python 中写 dict 还是写 {}?

python - Pandas 。将重复的行删除到另一个数据框

python - Pandas .map 字典默认缺失值

python - 范围(1 :len(df)) assigns NaN to last rows in dataframe

Python pycrypto 模块 : why simplejson can't dumps encrypted string?

python - 根据另一个列表对元组列表进行排序

python - 创建数字根函数