我有一个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')
即可。
答案 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)
这应该有效:
[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