我正在嘗試用更動態/資料驅動的 Python 腳本替換一些與時區更改相關的硬編碼 SQL 查詢。我有一個看起來像下面這個電子表格的資料集。WEEK_START/DAY/MONTH 是夏令時開始的周、日和月(例如,堪培拉從四月的第一個星期日開始,而維也納是三月的最后一個星期日)。結束變數采用相同的格式并在結束時顯示。
資料集
這是問題。我已經看到了針對諸如此類的特定用例的解決方案,找到了本月的最后一個星期日:
current_year=today.year
current_month=today.month
current_day=today.day
month = calendar.monthcalendar(current_year, current_month)
day_of_month = max(month[-1][calendar.SUNDAY], month[-2][calendar.SUNDAY])
print(day_of_month)
31
這告訴我這個月的最后一天是 31 號。我可以調整給定月份/場景的屬性,但是我將如何制作一列為每一行(城市)檢索每一行?也就是說,幾個城市在不同的日期改變時間?我想如果我可以在應用函式中的 day_of_month 中設定屬性,它會起作用,但是當我執行諸如 weekday='SUNDAY' 之類的操作時,它會回傳錯誤,因為當然字串 'SUNDAY' 與 SUNDAY 日歷的屬性不同。我的 SQL 查詢按同一天更改的城市分組,但理想情況下,任何人都可以根據需要編輯加載上述資料集的 CSV,然后每天運行一次腳本以查看今天是否在開始和結束之間夏令時。未來我們可能會增加新的城市。我有信心做到這一點,但對如何檢索給定年份的日期感到非常迷茫。
我的替代選擇是查看潛在日期的不同串列(三月的最后一個星期日,四月的第一個星期日等),撰寫代碼以預先檢索每個日期(如上面的片段所示),并分配這樣的日期。我說這不太靈活,因為如果添加的城市不適合時間更改的現有組,則代碼也需要更改。
所以stackoverflow,有沒有辦法通過apply或類似的東西在pandas中以資料驅動的方式做到這一點?提前致謝。
uj5u.com熱心網友回復:
基本上我認為你擁有大部分你需要的東西。只需將 WEEK_START / WEEK_END 列 {-1, 1} 映射到一個月的最后一天或第一天,將其全部放入一個函式中并將apply其放入每一行。前任:
import calendar
import operator
import pandas as pd
def get_date(year: int, month: int, dayname: str, first=-1) -> pd.Timestamp:
"""
get the first or last day "dayname" in given month and year.
returns last by default.
"""
daysinmonth = calendar.monthcalendar(year, month)
getday = operator.attrgetter(dayname.upper())
if first == 1:
day = daysinmonth[0][getday(calendar)]
else:
day = max(daysinmonth[-1][getday(calendar)], daysinmonth[-2][getday(calendar)])
return pd.Timestamp(year, month, day)
year = 2021 # we need a year...
df['date_start'] = df.apply(lambda row: get_date(year,
row['MONTH_START'],
row['DAY_START'],
row['WEEK_START']), # selects first or last
axis=1) # to each row
df['date_end'] = df.apply(lambda row: get_date(year,
row['MONTH_END'],
row['DAY_END'],
row['WEEK_END']),
axis=1)
給你樣本資料
df[['CITY', 'date_start', 'date_end']]
CITY date_start date_end
0 Canberra 2021-04-04 2021-10-03
1 Melbourne 2021-04-04 2021-10-03
2 Sydney 2021-04-04 2021-10-03
3 Kitzbuhel 2021-03-28 2021-10-31
4 Vienna 2021-03-28 2021-10-31
5 Antwerp 2021-03-28 2021-10-31
6 Brussels 2021-03-28 2021-10-31
7 Louvain-la-Neuve 2021-03-28 2021-10-31
一旦您開始使用時區和 DST 轉換,問:有沒有辦法在 Python 中推斷日期是否是 DST(夏令時)更改的實際日期?你也可能會感興趣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/313624.html
