【问题标题】:How to create a date range on specific dates for each month in Python?如何在 Python 中为每个月的特定日期创建日期范围?
【发布时间】:2020-12-16 20:52:10
【问题描述】:

我有一个开始日期和结束日期,我希望在特定日期(例如每个月的第 10 天)有开始和结束之间的日期范围 示例:

start_date = '2020-01-03'
end_date = '2020-10-19'

wanted_result = ['2020-01-03', '2020-01-10', '2020-02-10', '2020-03-10',...,'2020-10-10', '2020-10-19']

我目前有一个解决方案,它创建 start_date 和 end_date 之间的所有日期,然后仅对 10 日的日期进行子采样,但我不喜欢它,我认为它太麻烦了。有什么想法吗?

import pandas as pd
querydate = 10
dates = pd.date_range(start=start_date, end=end_date)
dates = dates[[0]].append(dates[dates.day == querydate])

【问题讨论】:

  • 您可以尝试找到满足您条件的第一个和最后一个日期,然后使用pd.date_range(start='2020-01-10', end='2020-10-10', freq='1M')。
  • 如果start_date = '2020-01-10' end_date = '2020-10-10' 然后只需要这个值一次,我是否理解正确?还是需要加倍2020-01-10, 2020-01-10,2020-02-10...2020-10-10,2020-10-10?
  • 只有一次!感谢您的帮助@jez

标签: python pandas


【解决方案1】:

如果还需要获取第一个和最后一个值,则通过最后一个和第一个值添加 Index.isin - 因此,如果第一天或最后一天是 10,则所有值都是唯一的,而不是重复的:

dates = pd.date_range(start=start_date, end=end_date)
dates = dates[dates.isin(dates[[0,-1]]) | (dates.day == querydate)]

print (dates)
DatetimeIndex(['2020-01-03', '2020-01-10', '2020-02-10', '2020-03-10',
               '2020-04-10', '2020-05-10', '2020-06-10', '2020-07-10',
               '2020-08-10', '2020-09-10', '2020-10-10', '2020-10-19'],
              dtype='datetime64[ns]', freq=None)

如需清单:

print (list(dates.strftime('%Y-%m-%d')))
['2020-01-03', '2020-01-10', '2020-02-10', '2020-03-10', 
 '2020-04-10', '2020-05-10', '2020-06-10', '2020-07-10', 
 '2020-08-10', '2020-09-10', '2020-10-10', '2020-10-19']

更改的示例数据:

start_date = '2020-01-10'
end_date = '2020-10-10'
querydate = 10

dates = pd.date_range(start=start_date, end=end_date)
dates = dates[dates.isin(dates[[0,-1]]) | (dates.day == querydate)]

print (dates)
DatetimeIndex(['2020-01-10', '2020-02-10', '2020-03-10', '2020-04-10',
               '2020-05-10', '2020-06-10', '2020-07-10', '2020-08-10',
               '2020-09-10', '2020-10-10'],
              dtype='datetime64[ns]', freq=None)

【讨论】:

  • 如果他想要字符串,也许这样:list(dates.strftime('%Y-%m-%d'))
  • 谢谢你的帮助,和我的思路差不多。我希望有一种更直接的方法,但在 Python 中似乎并非如此!
【解决方案2】:

试试这个:

dates = pd.Series([pd.to_datetime(start_date)] + [i for i in pd.date_range(start=start_date, end=end_date) if i.day == 10] + [pd.to_datetime(end_date)]).drop_duplicates()
print(dates)

输出:

    0    2020-01-03
1    2020-01-10
2    2020-02-10
3    2020-03-10
4    2020-04-10
5    2020-05-10
6    2020-06-10
7    2020-07-10
8    2020-08-10
9    2020-09-10
10   2020-10-10
11   2020-10-19
dtype: datetime64[ns]

【讨论】:

  • @jezrael 你是什么意思?
  • 最后的值将相同。
  • @jezraelI 更新我的答案
  • 也缺少开始日期
  • 很遗憾没有。
猜你喜欢
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
相关资源
最近更新 更多