【问题标题】:Modify date in pandas DataFrame修改 pandas DataFrame 中的日期
【发布时间】:2020-05-25 02:56:51
【问题描述】:

我从 csv 文件中读取了一些数据,并希望将所有日期转换为月初,然后绘制数据。我知道如何操作pandas.core.indexes.datetimes.DatetimeIndex 对象,这要感谢这个伟大的answer,但我不知道如何将其应用于我的DataFrame 对象。原因是我想在数据对齐的地方画一个漂亮的图。

这是 csv 文件:

Date,Type,Value
2019-02-18,data1,4255
2019-02-21,data2,4155
2019-03-15,data1,4007
2019-03-07,data2,2255
2019-04-16,data1,3498
2019-04-12,data2,4275
2019-05-17,data1,2814
2019-05-11,data2,3255

这里是我提取数据的代码:

import pandas as pd
import matplotlib.pyplot as plt

read_data = pd.read_csv('example.csv', index_col=0, parse_dates=True)
read_data2 = read_data[['Type','Value']]
data1 = read_data2[(read_data2['Type']=='data1')]
data2 = read_data2[(read_data2['Type']=='data2')]
ax = data1.plot(label='data1', y='Value', marker='x')
data2.plot(ax=ax, label='data2', y='Value', marker='x')
plt.show()

data1 如下所示:

             Type  Value
Date                    
2019-02-18  data1   4255
2019-03-15  data1   4007
2019-04-16  data1   3498
2019-05-17  data1   2814

但我希望它看起来像

             Type  Value
Date                    
2019-02-01  data1   4255
2019-03-01  data1   4007
2019-04-01  data1   3498
2019-05-01  data1   2814

感谢您的帮助!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果你知道你每个月有一个数据点,那么

    df.resample('1M', label='left').first()  # end of month
    df.resample('MS', label='left').first()  # beginning of month
    

    应该可以解决问题。

    【讨论】:

    • 谢谢,我确实每个月有一个数据点或每隔一个月有一个数据点(改用“2M”),所以你的答案几乎是完美的。但是,我得到2019-01-31 而不是2019-02-01。任何想法如何解决这个问题?
    • 无论label 和closed 的组合如何,都不会改变任何内容。
    • @Hannebambel 试试convention="start" 或convention="end"
    • 这也无济于事。但是,我找到了解决方案:使用MS 而不是M。 MS 将采样到月初,而 M 采样到月末。在文档中找到它:pandas.pydata.org/pandas-docs/stable/user_guide/… 感谢您的帮助!
    • @Hannebambel 一个人生活和学习!感谢您解决这个问题!
    猜你喜欢
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 2013-11-18
    • 2014-05-18
    相关资源
    最近更新 更多