这个月的第一个日期的日期如何?

时间:2017-02-16 21:36:57

标签: python date pandas numpy

我有一个pandas DataFrame,其索引列为date

输入:

            value
date    
1986-01-31  22.93
1986-02-28  15.46

我希望将日期设置为该月的第一天

输出:

            value
date    
1986-01-01  22.93
1986-02-01  15.46

我尝试了什么:

df.index.floor('M')
ValueError: <MonthEnd> is a non-fixed frequency

这可能是因为df是由...生成的 df = df.resample("M").sum()(此代码的输出是问题开头的输入)

我也试过df = df.resample("M", convention='start').sum()。但是,它不起作用。

我知道在R中,只需拨打floor(date, 'M')即可。

9 个答案:

答案 0 :(得分:6)

您可以使用timeseries offset MonthBegin

from pandas.tseries.offsets import MonthBegin
df['date'] = pd.to_datetime(df['date']) - MonthBegin(1)

编辑: 上述解决方案不处理已经到月初的日期。这是另一种解决方案。

这是一个包含其他测试用例的数据框:

            value
date    
1986-01-31  22.93
1986-02-28  15.46
2018-01-01  20.00
2018-02-02  25.00

使用timedelta方法,

df.index = pd.to_datetime(df.index)
df.index = df.index - pd.to_timedelta(df.index.day - 1, unit='d')


            value
date    
1986-01-01  22.93
1986-02-01  15.46
2018-01-01  20.00
2018-02-01  25.00

答案 1 :(得分:4)

这是另一种'pandonic'方式:

df.date - pd.Timedelta('1 day') * (df.date.dt.day - 1)

答案 2 :(得分:2)

dt_1 = "2016-02-01"
def first_day(dt):
    lt_split = dt.split("-")
    return "-".join([lt_split[0], lt_split[1], "01"])

print first_day(dt_1)

对于Panda的DataFrame,您可以使用dt["col_name_date"].apply(first_day)

答案 3 :(得分:2)

这样做就可以了,不需要进口。 Numpy有一个dtype datetime64,默认情况下,pandas设置为[ns],如检查dtype所示。您可以将此更改为月份,该月份将通过访问numpy数组并更改类型从本月的第一天开始。

df.date = pd.to_datetime(df.date.values.astype('datetime64[M]'))

如果pandas使用自己的astype()方法实现这一点会很好,但不幸的是你不能。

上述内容适用于数据作为日期时间值或字符串,如果您已将数据设为datetime[ns]类型,则可以省略pd.to_datetime()并执行以下操作:

df.date = df.date.values.astype('datetime64[M]')

答案 4 :(得分:2)

关于场内问题有pandas issue

建议的方式是

import pandas as pd
pd.to_datetime(df.date).dt.to_period('M').dt.to_timestamp()

答案 5 :(得分:1)

喜欢Mikhail Venkov的答案。添加了以下代码,以将列添加为时间戳值并保留时区信息

    df['month'] = pd.to_datetime(df['timestamp'].dt.strftime('%Y-%m-01')).dt.tz_localize(timezone) 

其中timezone ='America / Los_Angeles'或您想要的任何区域

答案 6 :(得分:0)

您还可以使用字符串日期时间格式:

df['month'] = df['date'].dt.strftime('%Y-%m-01')

答案 7 :(得分:0)

自2019年8月起:

这应该有效:

[x.replace(day=1).date() for x in df['date']]

仅需确保date是日期时间,我们可以通过调用pd.to_datetime(df['date'])

来保证

答案 8 :(得分:0)

假设您正在处理以下数据框:

import pandas as pd

df = pd.DataFrame({'MyDate': ['2021-03-11', '2021-04-26', '2021-01-17']})
df['MyDate'] = pd.to_datetime(df.MyDate)

是:

    MyDate
0   2021-03-11
1   2021-04-26
2   2021-01-17

并且您想将日期截断为月份:

df['Truncated'] = df['MyDate'] + pd.offsets.MonthBegin(-1)
# OR    
# df['Truncated'] = df['MyDate'] - pd.offsets.MonthBegin(1)
df

你会得到:

      MyDate  Truncated
0 2021-03-11 2021-03-01
1 2021-04-26 2021-04-01
2 2021-01-17 2021-01-01