将日期索引 dtype 从对象更改为日期时间以进行每月可视化

Posted

技术标签:

【中文标题】将日期索引 dtype 从对象更改为日期时间以进行每月可视化【英文标题】:Change Date Index dtype from object to datetime for monthly basis visualisation 【发布时间】:2020-09-27 17:34:42 【问题描述】:

我正在处理一个看起来像这样的数据集

Index Month Day Year    Temperature in Fahrenheit
0      1    1   2000    77.8
1      1    2   2000    79.3
2      1    3   2000    78.6
3      1    4   2000    78.6
4      1    5   2000    81.1
...   ...   ... ... ...
7299   12   27  2019    79.3
7300   12   28  2019    80.7
7301   12   29  2019    80.1
7302   12   30  2019    77.5
7303   12   31  2019    74.3

列的类型如下:

Month int64
Day   int64
Year  int64
Temperature in Fahrenheit float64.

现在,问题陈述是我想将此数据转换为月度数据,取该月天数的平均值。一个sn-p如下图

Date
2000-01    78.241935
2000-02    76.510345
2000-03    80.496774
2000-04    84.100000
2000-05    84.841935
             ...    
2019-08    82.912903
2019-09    81.620000
2019-10    84.287097
2019-11    84.236667
2019-12    81.635484

我希望日期索引(现在是对象类型)的格式为日期时间,以便我可以按月正确地可视化它们。

提前谢谢你。

【问题讨论】:

【参考方案1】:

pd.to_datetime

idx = pd.to_datetime(df[['Month', 'Day', 'Year']])
vals = df['Temperature in Fahrenheit'].to_numpy()

pd.Series(vals, idx)

2000-01-01    77.8
2000-01-02    79.3
2000-01-03    78.6
2000-01-04    78.6
2000-01-05    81.1
2019-12-27    79.3
2019-12-28    80.7
2019-12-29    80.1
2019-12-30    77.5
2019-12-31    74.3
dtype: float64

您可以通过 resample 跟进该问题

pd.Series(vals, idx).resample('M').mean()

【讨论】:

【参考方案2】:

只是另一种方法:

data=df.groupby(['Year','Month']).apply(lambda x:x['Temperature in Fahrenheit'].sum()).reset_index()
data['Date']=data['Year']+'-'+data['Month']
data.drop(columns=['Year','Month'],inplace=True)
data['Date']=pd.to_datetime(data['Date'],format='%Y-%-m')

【讨论】:

【参考方案3】:

另一种方式,可能不像@piRSquared那么短

强制将月、日和年转换为字符串

df[['Month', 'Day', 'Year']]=df.iloc[:, 1:-1].apply(lambda x: x.astype(str))

连接日、月和年并强制转换为日期时间

df['Date']=pd.to_datetime(df.pop('Day').str.cat([df.pop('Month'),df.pop('Year')], sep=' '))

按日期和平均值分组

df.set_index('Date', inplace=True)#Set Date as index
df.groupby(df.index.date).agg(TemperatureinFahrenheit= ('TemperatureinFahrenheit','mean'))#Groupby date and mean

【讨论】:

以上是关于将日期索引 dtype 从对象更改为日期时间以进行每月可视化的主要内容,如果未能解决你的问题,请参考以下文章

将python中索引的日期格式从yyyy-dd-mm更改为yyyy-mm-dd

将 Python Pandas 中的列名从日期时间对象更改为字符串?

将熊猫数据框中的多列更改为日期时间

如何将日期格式从对象的猫鼬数组更改为 ejs 视图上的字符串?

在 kibana-7.1.1 中将日期格式从纪元更改为日期

将索引转换为日期时间对象后,MatplotLib 无法正确绘制熊猫时间序列 1 分钟数据